Mercurial > hg > graal-compiler
changeset 15170:ac66c9c60d02
Merge.
author | Thomas Wuerthinger <thomas.wuerthinger@oracle.com> |
---|---|
date | Wed, 16 Apr 2014 19:07:21 +0200 |
parents | 0ba58961ba14 (diff) f4e31f06b019 (current diff) |
children | 261a67e7a8f1 |
files | graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/AbstractBlock.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/AbstractBlockBase.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/AbstractControlFlowGraph.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/BlockMap.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/Loop.java |
diffstat | 44 files changed, 269 insertions(+), 273 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/CodeCacheProvider.java Wed Apr 16 17:57:11 2014 +0200 +++ b/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/CodeCacheProvider.java Wed Apr 16 19:07:21 2014 +0200 @@ -34,18 +34,18 @@ /** * Adds the given compilation result as an implementation of the given method without making it * the default implementation. - * + * * @param method a method to which the executable code is begin added * @param compResult the compilation result to be added * @param speculationLog the speculation log to be used * @return a reference to the compiled and ready-to-run code or null if the code installation * failed */ - InstalledCode addMethod(ResolvedJavaMethod method, CompilationResult compResult, SpeculationLog speculationLog); + InstalledCode addMethod(ResolvedJavaMethod method, CompilationResult compResult, SpeculationLog speculationLog, InstalledCode predefinedInstalledCode); /** * Sets the given compilation result as the default implementation of the given method. - * + * * @param method a method to which the executable code is begin added * @param compResult the compilation result to be added * @return a reference to the compiled and ready-to-run code or null if the code installation @@ -55,11 +55,11 @@ /** * Returns a disassembly of some compiled code. - * + * * @param compResult some compiled code * @param installedCode the result of installing the code in {@code compResult} or null if the * code has not yet been installed - * + * * @return a disassembly. This will be of length 0 if the runtime does not support * disassembling. */ @@ -73,7 +73,7 @@ /** * Minimum size of the stack area reserved for outgoing parameters. This area is reserved in all * cases, even when the compiled method has no regular call instructions. - * + * * @return the minimum size of the outgoing parameter area in bytes */ int getMinimumOutgoingSize();
--- a/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/InstalledCode.java Wed Apr 16 17:57:11 2014 +0200 +++ b/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/InstalledCode.java Wed Apr 16 19:07:21 2014 +0200 @@ -22,41 +22,66 @@ */ package com.oracle.graal.api.code; -import com.oracle.graal.api.meta.*; - /** * Represents a compiled instance of a method. It may have been invalidated or removed in the * meantime. */ -public interface InstalledCode { +public class InstalledCode { + + /** + * Raw address of this code blob. + */ + private long address; + + /** + * Counts how often the address field was reassigned. + */ + private long version; /** - * Returns the method (if any) to which the installed code belongs. + * @return the address of this code blob */ - ResolvedJavaMethod getMethod(); + public final long getAddress() { + return address; + } + + /** + * @return the address of this code blob + */ + public final long getVersion() { + return version; + } /** * Returns the start address of this installed code if it is {@linkplain #isValid() valid}, 0 * otherwise. */ - long getStart(); + public long getStart() { + return 0; + } /** * Returns a copy of this installed code if it is {@linkplain #isValid() valid}, null otherwise. */ - byte[] getCode(); + public byte[] getCode() { + return null; + } /** * @return true if the code represented by this object is still valid, false otherwise (may * happen due to deopt, etc.) */ - boolean isValid(); + public boolean isValid() { + return address != 0; + } /** * Invalidates this installed code such that any subsequent invocation will throw an * {@link InvalidInstalledCodeException}. */ - void invalidate(); + public void invalidate() { + + } /** * Executes the installed code with a variable number of arguments. @@ -64,5 +89,8 @@ * @param args the array of object arguments * @return the value returned by the executed code */ - Object executeVarargs(Object... args) throws InvalidInstalledCodeException; + @SuppressWarnings("unused") + public Object executeVarargs(Object... args) throws InvalidInstalledCodeException { + return null; + } }
--- a/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/package-info.java Wed Apr 16 17:57:11 2014 +0200 +++ b/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/package-info.java Wed Apr 16 19:07:21 2014 +0200 @@ -23,7 +23,7 @@ /** * Package that defines the interface between a Java application that wants to install code and the runtime. * The runtime provides in implementation of the {@link com.oracle.graal.api.code.CodeCacheProvider} interface. - * The method {@link com.oracle.graal.api.code.CodeCacheProvider#addMethod(com.oracle.graal.api.meta.ResolvedJavaMethod, CompilationResult, SpeculationLog)} + * The method {@link com.oracle.graal.api.code.CodeCacheProvider#addMethod(com.oracle.graal.api.meta.ResolvedJavaMethod, CompilationResult, SpeculationLog, InstalledCode)} * can be used to install code for a given method. */ package com.oracle.graal.api.code;
--- a/graal/com.oracle.graal.asm.test/src/com/oracle/graal/asm/test/AssemblerTest.java Wed Apr 16 17:57:11 2014 +0200 +++ b/graal/com.oracle.graal.asm.test/src/com/oracle/graal/asm/test/AssemblerTest.java Wed Apr 16 19:07:21 2014 +0200 @@ -61,7 +61,7 @@ byte[] targetCode = test.generateCode(compResult, codeCache.getTarget(), registerConfig, cc); compResult.setTargetCode(targetCode, targetCode.length); - InstalledCode code = codeCache.addMethod(method, compResult, null); + InstalledCode code = codeCache.addMethod(method, compResult, null, null); DisassemblerProvider dis = Graal.getRequiredCapability(RuntimeProvider.class).getHostBackend().getDisassembler(); if (dis != null) {
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/GraalCompilerTest.java Wed Apr 16 17:57:11 2014 +0200 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/GraalCompilerTest.java Wed Apr 16 19:07:21 2014 +0200 @@ -675,7 +675,7 @@ } protected InstalledCode addMethod(final ResolvedJavaMethod method, final CompilationResult compResult) { - return getCodeCache().addMethod(method, compResult, null); + return getCodeCache().addMethod(method, compResult, null, null); } /**
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Wed Apr 16 17:57:11 2014 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Wed Apr 16 19:07:21 2014 +0200 @@ -128,9 +128,8 @@ * * @param graph the graph to be compiled * @param cc the calling convention for calls to the code compiled for {@code graph} - * @param installedCodeOwner the method the compiled code will be - * {@linkplain InstalledCode#getMethod() associated} with once installed. This - * argument can be null. + * @param installedCodeOwner the method the compiled code will be associated with once + * installed. This argument can be null. * @return the result of the compilation */ public static <T extends CompilationResult> T compileGraph(StructuredGraph graph, Object stub, CallingConvention cc, ResolvedJavaMethod installedCodeOwner, Providers providers, Backend backend,
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/Backend.java Wed Apr 16 17:57:11 2014 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/Backend.java Wed Apr 16 19:07:21 2014 +0200 @@ -102,9 +102,8 @@ /** * Emits the code for a given graph. * - * @param installedCodeOwner the method the compiled code will be - * {@linkplain InstalledCode#getMethod() associated} with once installed. This - * argument can be null. + * @param installedCodeOwner the method the compiled code will be associated with once + * installed. This argument can be null. */ public abstract void emitCode(CompilationResultBuilder crb, LIR lir, ResolvedJavaMethod installedCodeOwner);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/CompilationTask.java Wed Apr 16 17:57:11 2014 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/CompilationTask.java Wed Apr 16 19:07:21 2014 +0200 @@ -312,7 +312,7 @@ } try (TimerCloseable b = CodeInstallationTime.start()) { - installedCode = installMethod(result); + installedCode = (HotSpotInstalledCode) installMethod(result); if (!isOSR) { ProfilingInfo profile = method.getProfilingInfo(); profile.setCompilerIRSize(StructuredGraph.class, graph.getNodeCount()); @@ -385,9 +385,9 @@ MetaUtil.format("%H::%n(%p)", method), isOSR ? "@ " + entryBCI + " " : "", method.getCodeSize())); } - private HotSpotInstalledCode installMethod(final CompilationResult compResult) { + private InstalledCode installMethod(final CompilationResult compResult) { final HotSpotCodeCacheProvider codeCache = backend.getProviders().getCodeCache(); - HotSpotInstalledCode installedCode = null; + InstalledCode installedCode = null; try (Scope s = Debug.scope("CodeInstall", new DebugDumpScope(String.valueOf(id), true), codeCache, method)) { installedCode = codeCache.installMethod(method, compResult); } catch (Throwable e) {
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java Wed Apr 16 17:57:11 2014 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java Wed Apr 16 19:07:21 2014 +0200 @@ -226,7 +226,7 @@ * @param code the details of the installed CodeBlob are written to this object * @return the outcome of the installation as a {@link CodeInstallResult}. */ - CodeInstallResult installCode(HotSpotCompiledCode compiledCode, HotSpotInstalledCode code, SpeculationLog speculationLog); + CodeInstallResult installCode(HotSpotCompiledCode compiledCode, InstalledCode code, SpeculationLog speculationLog); /** * Notifies the VM of statistics for a completed compilation. @@ -240,7 +240,7 @@ * @param timeUnitsPerSecond the granularity of the units for the {@code time} value * @param installedCode the nmethod installed as a result of the compilation */ - void notifyCompilationStatistics(int id, HotSpotResolvedJavaMethod method, boolean osr, int processedBytecodes, long time, long timeUnitsPerSecond, HotSpotInstalledCode installedCode); + void notifyCompilationStatistics(int id, HotSpotResolvedJavaMethod method, boolean osr, int processedBytecodes, long time, long timeUnitsPerSecond, InstalledCode installedCode); void printCompilationStatistics(boolean perCompiler, boolean aggregate); @@ -270,9 +270,9 @@ StackTraceElement getStackTraceElement(long metaspaceMethod, int bci); - Object executeCompiledMethod(Object arg1, Object arg2, Object arg3, HotSpotInstalledCode hotspotInstalledCode) throws InvalidInstalledCodeException; + Object executeCompiledMethod(Object arg1, Object arg2, Object arg3, InstalledCode hotspotInstalledCode) throws InvalidInstalledCodeException; - Object executeCompiledMethodVarargs(Object[] args, HotSpotInstalledCode hotspotInstalledCode) throws InvalidInstalledCodeException; + Object executeCompiledMethodVarargs(Object[] args, InstalledCode hotspotInstalledCode) throws InvalidInstalledCodeException; long[] getLineNumberTable(long metaspaceMethod); @@ -295,7 +295,7 @@ */ void reprofile(long metaspaceMethod); - void invalidateInstalledCode(HotSpotInstalledCode hotspotInstalledCode); + void invalidateInstalledCode(InstalledCode hotspotInstalledCode); /** * Collects the current values of all Graal benchmark counters, summed up over all threads.
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java Wed Apr 16 17:57:11 2014 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java Wed Apr 16 19:07:21 2014 +0200 @@ -32,10 +32,10 @@ */ public class CompilerToVMImpl implements CompilerToVM { - private native int installCode0(HotSpotCompiledCode compiledCode, HotSpotInstalledCode code, SpeculationLog speculationLog); + private native int installCode0(HotSpotCompiledCode compiledCode, InstalledCode code, SpeculationLog speculationLog); @Override - public CodeInstallResult installCode(HotSpotCompiledCode compiledCode, HotSpotInstalledCode code, SpeculationLog speculationLog) { + public CodeInstallResult installCode(HotSpotCompiledCode compiledCode, InstalledCode code, SpeculationLog speculationLog) { return CodeInstallResult.getEnum(installCode0(compiledCode, code, speculationLog)); } @@ -120,7 +120,7 @@ public native StackTraceElement getStackTraceElement(long metaspaceMethod, int bci); @Override - public native Object executeCompiledMethodVarargs(Object[] args, HotSpotInstalledCode hotspotInstalledCode); + public native Object executeCompiledMethodVarargs(Object[] args, InstalledCode hotspotInstalledCode); @Override public native long[] getLineNumberTable(long metaspaceMethod); @@ -138,7 +138,7 @@ public native void reprofile(long metaspaceMethod); @Override - public native void invalidateInstalledCode(HotSpotInstalledCode hotspotInstalledCode); + public native void invalidateInstalledCode(InstalledCode hotspotInstalledCode); @Override public native Class<?> getJavaMirror(long metaspaceKlass); @@ -150,12 +150,12 @@ public native void doNotInlineOrCompile(long metaspaceMethod); @Override - public Object executeCompiledMethod(Object arg1, Object arg2, Object arg3, HotSpotInstalledCode hotspotInstalledCode) throws InvalidInstalledCodeException { + public Object executeCompiledMethod(Object arg1, Object arg2, Object arg3, InstalledCode hotspotInstalledCode) throws InvalidInstalledCodeException { return executeCompiledMethodVarargs(new Object[]{arg1, arg2, arg3}, hotspotInstalledCode); } public synchronized native void notifyCompilationStatistics(int id, HotSpotResolvedJavaMethod method, boolean osr, int processedBytecodes, long time, long timeUnitsPerSecond, - HotSpotInstalledCode installedCode); + InstalledCode installedCode); public synchronized native void printCompilationStatistics(boolean perCompiler, boolean aggregate);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotCodeCacheProvider.java Wed Apr 16 17:57:11 2014 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotCodeCacheProvider.java Wed Apr 16 19:07:21 2014 +0200 @@ -196,7 +196,7 @@ return runtime.getConfig().runtimeCallStackSize; } - public HotSpotInstalledCode logOrDump(HotSpotInstalledCode installedCode, CompilationResult compResult) { + public InstalledCode logOrDump(InstalledCode installedCode, CompilationResult compResult) { if (Debug.isDumpEnabled()) { Debug.dump(new Object[]{compResult, installedCode}, "After code installation"); } @@ -206,7 +206,7 @@ return installedCode; } - public HotSpotInstalledCode installMethod(HotSpotResolvedJavaMethod method, CompilationResult compResult) { + public InstalledCode installMethod(HotSpotResolvedJavaMethod method, CompilationResult compResult) { if (compResult.getId() == -1) { compResult.setId(method.allocateCompileId(compResult.getEntryBCI())); } @@ -216,17 +216,21 @@ } @Override - public InstalledCode addMethod(ResolvedJavaMethod method, CompilationResult compResult, SpeculationLog log) { + public InstalledCode addMethod(ResolvedJavaMethod method, CompilationResult compResult, SpeculationLog log, InstalledCode predefinedInstalledCode) { HotSpotResolvedJavaMethod hotspotMethod = (HotSpotResolvedJavaMethod) method; if (compResult.getId() == -1) { compResult.setId(hotspotMethod.allocateCompileId(compResult.getEntryBCI())); } - HotSpotInstalledCode code = new HotSpotNmethod(hotspotMethod, compResult.getName(), false); - CodeInstallResult result = runtime.getCompilerToVM().installCode(new HotSpotCompiledNmethod(target, hotspotMethod, compResult), code, log); + InstalledCode installedCode = predefinedInstalledCode; + if (installedCode == null) { + HotSpotInstalledCode code = new HotSpotNmethod(hotspotMethod, compResult.getName(), false); + installedCode = code; + } + CodeInstallResult result = runtime.getCompilerToVM().installCode(new HotSpotCompiledNmethod(target, hotspotMethod, compResult), installedCode, log); if (result != CodeInstallResult.OK) { return null; } - return logOrDump(code, compResult); + return logOrDump(installedCode, compResult); } @Override @@ -273,7 +277,7 @@ public String disassemble(InstalledCode code) { if (code.isValid()) { - long codeBlob = ((HotSpotInstalledCode) code).getCodeBlob(); + long codeBlob = ((HotSpotInstalledCode) code).getAddress(); return runtime.getCompilerToVM().disassembleCodeBlob(codeBlob); } return null;
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotDisassemblerProvider.java Wed Apr 16 17:57:11 2014 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotDisassemblerProvider.java Wed Apr 16 19:07:21 2014 +0200 @@ -38,7 +38,7 @@ public String disassemble(InstalledCode code) { if (code.isValid()) { - long codeBlob = ((HotSpotInstalledCode) code).getCodeBlob(); + long codeBlob = ((HotSpotInstalledCode) code).getAddress(); return runtime.getCompilerToVM().disassembleCodeBlob(codeBlob); } return null;
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotInstalledCode.java Wed Apr 16 17:57:11 2014 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotInstalledCode.java Wed Apr 16 19:07:21 2014 +0200 @@ -26,19 +26,11 @@ import sun.misc.*; import com.oracle.graal.api.code.*; -import com.oracle.graal.hotspot.*; /** * Implementation of {@link InstalledCode} for HotSpot. */ -public abstract class HotSpotInstalledCode extends CompilerObject implements InstalledCode { - - private static final long serialVersionUID = 156632908220561612L; - - /** - * Raw address of this code blob. - */ - private long codeBlob; +public abstract class HotSpotInstalledCode extends InstalledCode { /** * Total size of the code blob. @@ -56,13 +48,6 @@ private int codeSize; /** - * @return the address of this code blob - */ - public long getCodeBlob() { - return codeBlob; - } - - /** * @return the total size of this code blob */ public int getSize() { @@ -77,13 +62,14 @@ return null; } byte[] blob = new byte[size]; - unsafe.copyMemory(null, codeBlob, blob, Unsafe.ARRAY_BYTE_BASE_OFFSET, size); + unsafe.copyMemory(null, getAddress(), blob, Unsafe.ARRAY_BYTE_BASE_OFFSET, size); return blob; } @Override public abstract String toString(); + @Override public long getStart() { return codeStart; } @@ -92,6 +78,7 @@ return codeSize; } + @Override public byte[] getCode() { if (!isValid()) { return null;
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotNmethod.java Wed Apr 16 17:57:11 2014 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotNmethod.java Wed Apr 16 19:07:21 2014 +0200 @@ -40,8 +40,6 @@ */ public final class HotSpotNmethod extends HotSpotInstalledCode { - private static final long serialVersionUID = -1784683588947054103L; - /** * This (indirect) Method* reference is safe since class redefinition preserves all methods * associated with nmethods in the code cache. @@ -71,24 +69,18 @@ return isExternal; } - @Override public ResolvedJavaMethod getMethod() { return method; } @Override - public boolean isValid() { - return getCodeBlob() != 0; - } - - @Override public void invalidate() { runtime().getCompilerToVM().invalidateInstalledCode(this); } @Override public String toString() { - return String.format("InstalledNmethod[method=%s, codeBlob=0x%x, isDefault=%b, name=%s]", method, getCodeBlob(), isDefault, name); + return String.format("InstalledNmethod[method=%s, codeBlob=0x%x, isDefault=%b, name=%s]", method, getAddress(), isDefault, name); } protected boolean checkThreeObjectArgs() {
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntimeStub.java Wed Apr 16 17:57:11 2014 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntimeStub.java Wed Apr 16 19:07:21 2014 +0200 @@ -32,8 +32,6 @@ */ public class HotSpotRuntimeStub extends HotSpotInstalledCode { - private static final long serialVersionUID = -6388648408298441748L; - private final Stub stub; public HotSpotRuntimeStub(Stub stub) { @@ -44,18 +42,21 @@ return null; } + @Override public boolean isValid() { return true; } + @Override public void invalidate() { } @Override public String toString() { - return String.format("InstalledRuntimeStub[stub=%s, codeBlob=0x%x]", stub, getCodeBlob()); + return String.format("InstalledRuntimeStub[stub=%s, codeBlob=0x%x]", stub, getAddress()); } + @Override public Object executeVarargs(Object... args) throws InvalidInstalledCodeException { throw new GraalInternalError("Cannot call stub %s", stub); }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nfi/HotSpotNativeFunctionInterface.java Wed Apr 16 17:57:11 2014 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nfi/HotSpotNativeFunctionInterface.java Wed Apr 16 19:07:21 2014 +0200 @@ -161,7 +161,7 @@ DefaultProfilingInfo.get(TriState.UNKNOWN), null, suites, new CompilationResult(), CompilationResultBuilderFactory.Default); InstalledCode installedCode; try (Scope s = Debug.scope("CodeInstall", providers.getCodeCache(), g.method())) { - installedCode = providers.getCodeCache().addMethod(g.method(), compResult, null); + installedCode = providers.getCodeCache().addMethod(g.method(), compResult, null, null); } return installedCode; }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/Stub.java Wed Apr 16 17:57:11 2014 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/Stub.java Wed Apr 16 19:07:21 2014 +0200 @@ -95,7 +95,7 @@ /** * Creates a new stub. - * + * * @param linkage linkage details for a call to the stub */ public Stub(HotSpotProviders providers, HotSpotForeignCallLinkage linkage) { @@ -125,8 +125,7 @@ } /** - * Gets the method the stub's code will be {@linkplain InstalledCode#getMethod() associated} - * with once installed. This may be null. + * Gets the method the stub's code will be associated with once installed. This may be null. */ protected abstract ResolvedJavaMethod getInstalledCodeOwner();
--- a/graal/com.oracle.graal.truffle.hotspot.amd64/src/com/oracle/graal/truffle/hotspot/amd64/AMD64OptimizedCallTargetInstrumentationFactory.java Wed Apr 16 17:57:11 2014 +0200 +++ b/graal/com.oracle.graal.truffle.hotspot.amd64/src/com/oracle/graal/truffle/hotspot/amd64/AMD64OptimizedCallTargetInstrumentationFactory.java Wed Apr 16 19:07:21 2014 +0200 @@ -31,7 +31,6 @@ import com.oracle.graal.asm.amd64.*; import com.oracle.graal.asm.amd64.AMD64Assembler.ConditionFlag; import com.oracle.graal.hotspot.*; -import com.oracle.graal.hotspot.amd64.*; import com.oracle.graal.hotspot.meta.*; import com.oracle.graal.lir.*; import com.oracle.graal.lir.asm.*; @@ -50,22 +49,9 @@ AMD64MacroAssembler asm = (AMD64MacroAssembler) this.asm; Register thisRegister = codeCache.getRegisterConfig().getCallingConventionRegisters(Type.JavaCall, Kind.Object)[0]; Register spillRegister = AMD64.r10; // TODO(mg): fix me - AMD64Address nMethodAddress = new AMD64Address(thisRegister, getFieldOffset("installedCode", OptimizedCallTarget.class)); - int verifiedEntryPoint = asm.position(); - if (config.useCompressedOops) { - asm.movl(spillRegister, nMethodAddress); - asm.nop(AMD64HotSpotBackend.PATCHED_VERIFIED_ENTRY_POINT_INSTRUCTION_SIZE - (asm.position() - verifiedEntryPoint)); - AMD64HotSpotMove.decodePointer(asm, spillRegister, registers.getHeapBaseRegister(), config.getOopEncoding()); - } else { - asm.movq(spillRegister, nMethodAddress); - asm.nop(AMD64HotSpotBackend.PATCHED_VERIFIED_ENTRY_POINT_INSTRUCTION_SIZE - (asm.position() - verifiedEntryPoint)); - } Label doProlog = new Label(); - asm.cmpq(spillRegister, 0); - asm.jcc(ConditionFlag.Equal, doProlog); - - AMD64Address codeBlobAddress = new AMD64Address(spillRegister, getFieldOffset("codeBlob", HotSpotInstalledCode.class)); + AMD64Address codeBlobAddress = new AMD64Address(thisRegister, getFieldOffset("address", InstalledCode.class)); asm.movq(spillRegister, codeBlobAddress); asm.cmpq(spillRegister, 0); asm.jcc(ConditionFlag.Equal, doProlog);
--- a/graal/com.oracle.graal.truffle.hotspot/src/com/oracle/graal/truffle/hotspot/HotSpotFrameInstance.java Wed Apr 16 17:57:11 2014 +0200 +++ b/graal/com.oracle.graal.truffle.hotspot/src/com/oracle/graal/truffle/hotspot/HotSpotFrameInstance.java Wed Apr 16 19:07:21 2014 +0200 @@ -154,7 +154,7 @@ public static final Method METHOD; static { try { - METHOD = RootCallTarget.class.getDeclaredMethod("callProxy", VirtualFrame.class); + METHOD = OptimizedCallTarget.class.getDeclaredMethod("callProxy", VirtualFrame.class); } catch (NoSuchMethodException | SecurityException e) { throw new GraalInternalError(e); }
--- a/graal/com.oracle.graal.truffle.hotspot/src/com/oracle/graal/truffle/hotspot/HotSpotOptimizedCallTarget.java Wed Apr 16 17:57:11 2014 +0200 +++ b/graal/com.oracle.graal.truffle.hotspot/src/com/oracle/graal/truffle/hotspot/HotSpotOptimizedCallTarget.java Wed Apr 16 19:07:21 2014 +0200 @@ -53,31 +53,29 @@ } public boolean isOptimized() { - return installedCode != null || installedCodeTask != null; + return isValid() || installedCodeTask != null; + } + + @Override + public Object call(Object... args) { + return callBoundary(args); } - @CompilerDirectives.SlowPath - @Override - public Object call(Object[] args) { - return CompilerDirectives.inInterpreter() ? callHelper(args) : executeHelper(args); + @TruffleCallBoundary + private Object callBoundary(Object[] args) { + if (CompilerDirectives.inInterpreter()) { + return compiledCallFallback(args); + } else { + // We come here from compiled code (i.e., we have been inlined). + return executeHelper(args); + } } - private Object callHelper(Object[] args) { - if (installedCode != null && installedCode.isValid()) { + private Object compiledCallFallback(Object[] args) { + if (isValid()) { reinstallCallMethodShortcut(); } - if (TruffleCallTargetProfiling.getValue()) { - callCount++; - } - if (CompilerDirectives.injectBranchProbability(CompilerDirectives.FASTPATH_PROBABILITY, installedCode != null)) { - try { - return installedCode.executeVarargs(new Object[]{this, args}); - } catch (InvalidInstalledCodeException ex) { - return compiledCodeInvalidated(args); - } - } else { - return interpreterCall(args); - } + return interpreterCall(args); } private static void reinstallCallMethodShortcut() { @@ -87,17 +85,11 @@ HotSpotTruffleRuntime.installOptimizedCallTargetCallMethod(); } - private Object compiledCodeInvalidated(Object[] args) { - invalidate(null, null, "Compiled code invalidated"); - return call(args); - } - @Override protected void invalidate(Node oldNode, Node newNode, CharSequence reason) { - InstalledCode m = this.installedCode; - if (m != null) { + if (isValid()) { CompilerAsserts.neverPartOfCompilation(); - installedCode = null; + invalidate(); compilationProfile.reportInvalidated(); logOptimizedInvalidated(this, oldNode, newNode, reason); } @@ -117,15 +109,16 @@ private Object interpreterCall(Object[] args) { CompilerAsserts.neverPartOfCompilation(); compilationProfile.reportInterpreterCall(); + if (TruffleCallTargetProfiling.getValue()) { + callCount++; + } if (compilationEnabled && compilationPolicy.shouldCompile(compilationProfile)) { - InstalledCode code = compile(); - if (code != null && code.isValid()) { - this.installedCode = code; + compile(); + if (isValid()) { try { - return code.executeVarargs(new Object[]{this, args}); + return executeVarargs(new Object[]{this, args}); } catch (InvalidInstalledCodeException ex) { - return compiledCodeInvalidated(args); } } } @@ -145,20 +138,14 @@ } @Override - public InstalledCode compile() { - if (isCompiling()) { - if (installedCodeTask.isDone()) { - return receiveInstalledCode(); - } - return null; - } else { + public void compile() { + if (!isCompiling()) { performInlining(); logOptimizingQueued(this); this.installedCodeTask = compiler.compile(this); if (!TruffleBackgroundCompilation.getValue()) { - return receiveInstalledCode(); + receiveInstalledCode(); } - return null; } }
--- a/graal/com.oracle.graal.truffle.hotspot/src/com/oracle/graal/truffle/hotspot/HotSpotTruffleRuntime.java Wed Apr 16 17:57:11 2014 +0200 +++ b/graal/com.oracle.graal.truffle.hotspot/src/com/oracle/graal/truffle/hotspot/HotSpotTruffleRuntime.java Wed Apr 16 19:07:21 2014 +0200 @@ -26,7 +26,6 @@ import static com.oracle.graal.compiler.GraalCompiler.*; import static com.oracle.graal.truffle.TruffleCompilerOptions.*; -import java.lang.reflect.*; import java.util.*; import com.oracle.graal.api.code.*; @@ -37,7 +36,6 @@ import com.oracle.graal.compiler.target.*; import com.oracle.graal.debug.*; import com.oracle.graal.debug.Debug.Scope; -import com.oracle.graal.graph.*; import com.oracle.graal.java.*; import com.oracle.graal.lir.asm.*; import com.oracle.graal.nodes.*; @@ -178,24 +176,18 @@ public static void installOptimizedCallTargetCallMethod() { Providers providers = getGraalProviders(); MetaAccessProvider metaAccess = providers.getMetaAccess(); - CodeCacheProvider codeCache = providers.getCodeCache(); - ResolvedJavaMethod resolvedCallMethod = metaAccess.lookupJavaMethod(getCallMethod()); - CompilationResult compResult = compileMethod(resolvedCallMethod); - try (Scope s = Debug.scope("CodeInstall", codeCache, resolvedCallMethod)) { - codeCache.setDefaultMethod(resolvedCallMethod, compResult); + ResolvedJavaType type = metaAccess.lookupJavaType(HotSpotOptimizedCallTarget.class); + for (ResolvedJavaMethod method : type.getDeclaredMethods()) { + if (method.getAnnotation(TruffleCallBoundary.class) != null) { + CompilationResult compResult = compileMethod(method); + CodeCacheProvider codeCache = providers.getCodeCache(); + try (Scope s = Debug.scope("CodeInstall", codeCache, method)) { + codeCache.setDefaultMethod(method, compResult); + } + } } } - private static Method getCallMethod() { - Method method; - try { - method = HotSpotOptimizedCallTarget.class.getDeclaredMethod("call", new Class[]{Object[].class}); - } catch (NoSuchMethodException | SecurityException e) { - throw GraalInternalError.shouldNotReachHere(); - } - return method; - } - private static CompilationResultBuilderFactory getOptimizedCallTargetInstrumentationFactory(String arch, ResolvedJavaMethod method) { for (OptimizedCallTargetInstrumentationFactory factory : ServiceLoader.loadInstalled(OptimizedCallTargetInstrumentationFactory.class)) { if (factory.getArchitecture().equals(arch)) {
--- a/graal/com.oracle.graal.truffle.hotspot/src/com/oracle/graal/truffle/hotspot/substitutions/HotSpotOptimizedCallTargetSubstitutions.java Wed Apr 16 17:57:11 2014 +0200 +++ b/graal/com.oracle.graal.truffle.hotspot/src/com/oracle/graal/truffle/hotspot/substitutions/HotSpotOptimizedCallTargetSubstitutions.java Wed Apr 16 19:07:21 2014 +0200 @@ -23,20 +23,9 @@ package com.oracle.graal.truffle.hotspot.substitutions; import com.oracle.graal.api.replacements.*; -import com.oracle.graal.nodes.spi.*; -import com.oracle.graal.truffle.*; import com.oracle.graal.truffle.hotspot.*; -import com.oracle.graal.truffle.nodes.asserts.*; @ClassSubstitution(HotSpotOptimizedCallTarget.class) public class HotSpotOptimizedCallTargetSubstitutions { - @MacroSubstitution(macro = NeverInlineMacroNode.class, isStatic = false) - public static native Object callHelper(OptimizedCallTarget target, Object[] args); - - @MacroSubstitution(macro = NeverInlineMacroNode.class, isStatic = false) - public static native Object interpreterCall(OptimizedCallTarget target, Object[] args); - - @MacroSubstitution(macro = NeverInlineMacroNode.class, isStatic = false) - public static native Object compiledCodeInvalidated(OptimizedCallTarget target, Object[] args); }
--- a/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/PartialEvaluationTest.java Wed Apr 16 17:57:11 2014 +0200 +++ b/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/PartialEvaluationTest.java Wed Apr 16 19:07:21 2014 +0200 @@ -64,7 +64,7 @@ protected InstalledCode assertPartialEvalEquals(String methodName, RootNode root, Object[] arguments) { Assumptions assumptions = new Assumptions(true); StructuredGraph actual = partialEval(root, arguments, assumptions, true); - InstalledCode result = truffleCompiler.compileMethodHelper(actual, assumptions, root.toString(), getSpeculationLog()); + InstalledCode result = truffleCompiler.compileMethodHelper(actual, assumptions, root.toString(), getSpeculationLog(), null); StructuredGraph expected = parseForComparison(methodName); removeFrameStates(actual); Assert.assertEquals(getCanonicalGraphString(expected, true, true), getCanonicalGraphString(actual, true, true));
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedAssumption.java Wed Apr 16 17:57:11 2014 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedAssumption.java Wed Apr 16 19:07:21 2014 +0200 @@ -23,7 +23,6 @@ package com.oracle.graal.truffle; import java.lang.ref.*; -import java.util.*; import com.oracle.graal.api.code.*; import com.oracle.truffle.api.impl.*; @@ -31,7 +30,13 @@ public final class OptimizedAssumption extends AbstractAssumption { - List<WeakReference<InstalledCode>> dependentInstalledCode; + private static class Entry { + WeakReference<InstalledCode> installedCode; + long version; + Entry next; + } + + private Entry first; public OptimizedAssumption(String name) { super(name); @@ -47,25 +52,26 @@ @Override public synchronized void invalidate() { if (isValid) { - if (dependentInstalledCode != null) { - for (WeakReference<InstalledCode> installedCodeReference : dependentInstalledCode) { - InstalledCode installedCode = installedCodeReference.get(); - if (installedCode != null) { - installedCode.invalidate(); - } + Entry e = first; + while (e != null) { + InstalledCode installedCode = e.installedCode.get(); + if (installedCode != null && installedCode.getVersion() == e.version) { + installedCode.invalidate(); } - dependentInstalledCode = null; + e = e.next; } + first = null; isValid = false; } } public synchronized void registerInstalledCode(InstalledCode installedCode) { if (isValid) { - if (dependentInstalledCode == null) { - dependentInstalledCode = new ArrayList<>(); - } - dependentInstalledCode.add(new WeakReference<>(installedCode)); + Entry e = new Entry(); + e.installedCode = new WeakReference<>(installedCode); + e.version = installedCode.getVersion(); + e.next = first; + first = e; } else { installedCode.invalidate(); }
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedCallTarget.java Wed Apr 16 17:57:11 2014 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedCallTarget.java Wed Apr 16 19:07:21 2014 +0200 @@ -33,17 +33,15 @@ import com.oracle.graal.debug.*; import com.oracle.truffle.api.*; import com.oracle.truffle.api.frame.*; -import com.oracle.truffle.api.impl.*; import com.oracle.truffle.api.nodes.*; /** * Call target that is optimized by Graal upon surpassing a specific invocation threshold. */ -public abstract class OptimizedCallTarget extends DefaultCallTarget implements LoopCountReceiver, ReplaceObserver { +public abstract class OptimizedCallTarget extends InstalledCode implements RootCallTarget, LoopCountReceiver, ReplaceObserver { protected static final PrintStream OUT = TTY.out().out(); - protected InstalledCode installedCode; protected boolean compilationEnabled; protected int callCount; protected boolean inliningPerformed; @@ -52,8 +50,16 @@ private OptimizedCallTarget splitSource; private final AtomicInteger callSitesKnown = new AtomicInteger(0); + private final RootNode rootNode; + + public final RootNode getRootNode() { + return rootNode; + } + public OptimizedCallTarget(RootNode rootNode, int invokeCounter, int compilationThreshold, boolean compilationEnabled, CompilationPolicy compilationPolicy) { - super(rootNode); + this.rootNode = rootNode; + this.rootNode.adoptChildren(); + this.rootNode.setCallTarget(this); this.compilationEnabled = compilationEnabled; this.compilationPolicy = compilationPolicy; this.compilationProfile = new CompilationProfile(compilationThreshold, invokeCounter, rootNode.toString()); @@ -62,6 +68,15 @@ } } + protected final Object callProxy(VirtualFrame frame) { + try { + return getRootNode().execute(frame); + } finally { + // this assertion is needed to keep the values from being cleared as non-live locals + assert frame != null && this != null; + } + } + public final int getKnownCallSiteCount() { return callSitesKnown.get(); } @@ -84,8 +99,8 @@ @Override public String toString() { - String superString = super.toString(); - if (installedCode != null) { + String superString = rootNode.toString(); + if (isValid()) { superString += " <compiled>"; } if (splitSource != null) { @@ -99,9 +114,9 @@ } @Override - public abstract Object call(Object[] args); + public abstract Object call(Object... args); - public abstract InstalledCode compile(); + public abstract void compile(); public final Object callInlined(Object[] arguments) { if (CompilerDirectives.inInterpreter()) {
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedCallTargetLog.java Wed Apr 16 17:57:11 2014 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedCallTargetLog.java Wed Apr 16 19:07:21 2014 +0200 @@ -266,7 +266,7 @@ } int nodeCount = OptimizedCallUtils.countNonTrivialNodes(callTarget, true); - String comment = callTarget.installedCode == null ? " int" : ""; + String comment = callTarget.isValid() ? "" : " int"; comment += callTarget.compilationEnabled ? "" : " fail"; OUT.printf("%-50s | %10d | %15d | %10d | %3d%s\n", callTarget.getRootNode(), callTarget.callCount, nodeCount, nodeCount, callTarget.getCompilationProfile().getInvalidationCount(), comment);
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java Wed Apr 16 17:57:11 2014 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java Wed Apr 16 19:07:21 2014 +0200 @@ -201,7 +201,7 @@ } StructuredGraph inlineGraph = replacements.getMethodSubstitution(methodCallTargetNode.targetMethod()); - if (inlineGraph == null && !Modifier.isNative(methodCallTargetNode.targetMethod().getModifiers())) { + if (inlineGraph == null && !Modifier.isNative(methodCallTargetNode.targetMethod().getModifiers()) && methodCallTargetNode.targetMethod().canBeInlined()) { inlineGraph = parseGraph(methodCallTargetNode.targetMethod(), methodCallTargetNode.arguments(), assumptions, phaseContext, false); }
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCacheImpl.java Wed Apr 16 17:57:11 2014 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCacheImpl.java Wed Apr 16 19:07:21 2014 +0200 @@ -264,9 +264,10 @@ } private boolean shouldInline(final MethodCallTargetNode methodCallTargetNode) { - return (methodCallTargetNode.invokeKind() == InvokeKind.Special || methodCallTargetNode.invokeKind() == InvokeKind.Static) && + boolean result = (methodCallTargetNode.invokeKind() == InvokeKind.Special || methodCallTargetNode.invokeKind() == InvokeKind.Static) && methodCallTargetNode.targetMethod().canBeInlined() && !Modifier.isNative(methodCallTargetNode.targetMethod().getModifiers()) && methodCallTargetNode.targetMethod().getAnnotation(ExplodeLoop.class) == null && methodCallTargetNode.targetMethod().getAnnotation(CompilerDirectives.SlowPath.class) == null && !methodCallTargetNode.targetMethod().getDeclaringClass().equals(stringBuilderClass); + return result; } }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCallBoundary.java Wed Apr 16 19:07:21 2014 +0200 @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2014, 2014, 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.truffle; + +import java.lang.annotation.*; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface TruffleCallBoundary { + +}
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCompilerImpl.java Wed Apr 16 17:57:11 2014 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCompilerImpl.java Wed Apr 16 19:07:21 2014 +0200 @@ -151,18 +151,14 @@ long timePartialEvaluationFinished = System.nanoTime(); int nodeCountPartialEval = graph.getNodeCount(); - InstalledCode compiledMethod = compileMethodHelper(graph, assumptions, compilable.toString(), compilable.getSpeculationLog()); + InstalledCode compiledMethod = compileMethodHelper(graph, assumptions, compilable.toString(), compilable.getSpeculationLog(), compilable); long timeCompilationFinished = System.nanoTime(); int nodeCountLowered = graph.getNodeCount(); - if (compiledMethod == null) { + if (!compiledMethod.isValid()) { throw new BailoutException("Could not install method, code cache is full!"); } - if (!compiledMethod.isValid()) { - return null; - } - if (TraceTruffleCompilation.getValue()) { byte[] code = compiledMethod.getCode(); int calls = OptimizedCallUtils.countCalls(compilable); @@ -188,7 +184,7 @@ return sourceSection != null ? sourceSection.toString() : "n/a"; } - public InstalledCode compileMethodHelper(StructuredGraph graph, Assumptions assumptions, String name, SpeculationLog speculationLog) { + public InstalledCode compileMethodHelper(StructuredGraph graph, Assumptions assumptions, String name, SpeculationLog speculationLog, InstalledCode predefinedInstalledCode) { try (Scope s = Debug.scope("TruffleFinal")) { Debug.dump(graph, "After TruffleTier"); } catch (Throwable e) { @@ -224,7 +220,7 @@ InstalledCode installedCode; try (Scope s = Debug.scope("CodeInstall", providers.getCodeCache()); TimerCloseable a = CodeInstallationTime.start()) { - installedCode = providers.getCodeCache().addMethod(graph.method(), result, speculationLog); + installedCode = providers.getCodeCache().addMethod(graph.method(), result, speculationLog, predefinedInstalledCode); } catch (Throwable e) { throw Debug.handle(e); }
--- a/graal/com.oracle.truffle.api.test/src/com/oracle/truffle/api/test/RootNodeTest.java Wed Apr 16 17:57:11 2014 +0200 +++ b/graal/com.oracle.truffle.api.test/src/com/oracle/truffle/api/test/RootNodeTest.java Wed Apr 16 19:07:21 2014 +0200 @@ -30,7 +30,7 @@ /** * <h3>Creating a Root Node</h3> - * + * * <p> * A Truffle root node is the entry point into a Truffle tree that represents a guest language * method. It contains a {@link RootNode#execute(VirtualFrame)} method that can return a @@ -38,9 +38,9 @@ * must however never be called directly. Instead, the Truffle runtime must be used to create a * {@link CallTarget} object from a root node using the * {@link TruffleRuntime#createCallTarget(RootNode)} method. This call target object can then be - * executed using the {@link CallTarget#call()} method or one of its overloads. + * executed using the {@link CallTarget#call(Object...)} method or one of its overloads. * </p> - * + * * <p> * The next part of the Truffle API introduction is at * {@link com.oracle.truffle.api.test.ChildNodeTest}.
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/CallTarget.java Wed Apr 16 17:57:11 2014 +0200 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/CallTarget.java Wed Apr 16 19:07:21 2014 +0200 @@ -27,9 +27,7 @@ /** * Represents the target of a call. */ -public abstract class CallTarget { - - public static final Object[] NO_ARGUMENTS = new Object[0]; +public interface CallTarget { /** * Calls this target as a root method.. @@ -37,11 +35,5 @@ * @param arguments passed arguments as an object array * @return the return result of the call */ - public abstract Object call(Object[] arguments); - - public final Object call() { - return call(NO_ARGUMENTS); - } - - public abstract void setNeedsMaterializedFrame(); + Object call(Object... arguments); }
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/RootCallTarget.java Wed Apr 16 17:57:11 2014 +0200 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/RootCallTarget.java Wed Apr 16 19:07:21 2014 +0200 @@ -24,38 +24,13 @@ */ package com.oracle.truffle.api; -import com.oracle.truffle.api.frame.*; import com.oracle.truffle.api.nodes.*; /** * Represents the target of a call to a {@link RootNode}, i.e., to another tree of nodes. Instances * of this class can be created using {@link TruffleRuntime#createCallTarget(RootNode)}. */ -public abstract class RootCallTarget extends CallTarget { - - private final RootNode rootNode; - - public RootCallTarget(RootNode function) { - this.rootNode = function; - this.rootNode.adoptChildren(); - this.rootNode.setCallTarget(this); - } +public interface RootCallTarget extends CallTarget { - @Override - public String toString() { - return rootNode.toString(); - } - - public final RootNode getRootNode() { - return rootNode; - } - - protected final Object callProxy(VirtualFrame frame) { - try { - return getRootNode().execute(frame); - } finally { - // this assertion is needed to keep the values from being cleared as non-live locals - assert frame != null && this != null; - } - } + RootNode getRootNode(); }
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultCallTarget.java Wed Apr 16 17:57:11 2014 +0200 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultCallTarget.java Wed Apr 16 19:07:21 2014 +0200 @@ -25,7 +25,6 @@ package com.oracle.truffle.api.impl; import com.oracle.truffle.api.*; -import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; import com.oracle.truffle.api.frame.*; import com.oracle.truffle.api.nodes.*; @@ -33,22 +32,28 @@ * This is an implementation-specific class. Do not use or instantiate it. Instead, use * {@link TruffleRuntime#createCallTarget(RootNode)} to create a {@link RootCallTarget}. */ -public class DefaultCallTarget extends RootCallTarget { +public class DefaultCallTarget implements RootCallTarget { + + private final RootNode rootNode; - @CompilationFinal protected boolean needsMaterializedFrame = true; - - protected DefaultCallTarget(RootNode function) { - super(function); + public DefaultCallTarget(RootNode function) { + this.rootNode = function; + this.rootNode.adoptChildren(); + this.rootNode.setCallTarget(this); } @Override - public Object call(Object[] args) { - VirtualFrame frame = new DefaultVirtualFrame(getRootNode().getFrameDescriptor(), args); - return callProxy(frame); + public String toString() { + return rootNode.toString(); + } + + public final RootNode getRootNode() { + return rootNode; } @Override - public void setNeedsMaterializedFrame() { - needsMaterializedFrame = true; + public Object call(Object... args) { + VirtualFrame frame = new DefaultVirtualFrame(getRootNode().getFrameDescriptor(), args); + return getRootNode().execute(frame); } }
--- a/src/gpu/hsail/vm/gpu_hsail.cpp Wed Apr 16 17:57:11 2014 +0200 +++ b/src/gpu/hsail/vm/gpu_hsail.cpp Wed Apr 16 19:07:21 2014 +0200 @@ -137,7 +137,7 @@ jobject donor_threads, jint allocBytesPerWorkitem)) ResourceMark rm; - jlong nmethodValue = HotSpotInstalledCode::codeBlob(kernel_handle); + jlong nmethodValue = InstalledCode::address(kernel_handle); if (nmethodValue == 0) { SharedRuntime::throw_and_post_jvmti_exception(JavaThread::current(), vmSymbols::com_oracle_graal_api_code_InvalidInstalledCodeException(), NULL); }
--- a/src/share/vm/classfile/systemDictionary.hpp Wed Apr 16 17:57:11 2014 +0200 +++ b/src/share/vm/classfile/systemDictionary.hpp Wed Apr 16 19:07:21 2014 +0200 @@ -230,6 +230,7 @@ do_klass(CompilationResult_Site_klass, com_oracle_graal_api_code_CompilationResult_Site, Opt) \ do_klass(ExternalCompilationResult_klass, com_oracle_graal_gpu_ExternalCompilationResult, Opt) \ do_klass(InfopointReason_klass, com_oracle_graal_api_code_InfopointReason, Opt) \ + do_klass(InstalledCode_klass, com_oracle_graal_api_code_InstalledCode, Opt) \ do_klass(code_Register_klass, com_oracle_graal_api_code_Register, Opt) \ do_klass(RegisterValue_klass, com_oracle_graal_api_code_RegisterValue, Opt) \ do_klass(StackSlot_klass, com_oracle_graal_api_code_StackSlot, Opt) \
--- a/src/share/vm/classfile/vmSymbols.hpp Wed Apr 16 17:57:11 2014 +0200 +++ b/src/share/vm/classfile/vmSymbols.hpp Wed Apr 16 19:07:21 2014 +0200 @@ -347,6 +347,7 @@ template(com_oracle_graal_api_code_CompilationResult_Infopoint, "com/oracle/graal/api/code/CompilationResult$Infopoint") \ template(com_oracle_graal_api_code_CompilationResult_Site, "com/oracle/graal/api/code/CompilationResult$Site") \ template(com_oracle_graal_api_code_InfopointReason, "com/oracle/graal/api/code/InfopointReason") \ + template(com_oracle_graal_api_code_InstalledCode, "com/oracle/graal/api/code/InstalledCode") \ template(com_oracle_graal_api_code_BytecodeFrame, "com/oracle/graal/api/code/BytecodeFrame") \ template(com_oracle_graal_api_code_BytecodePosition, "com/oracle/graal/api/code/BytecodePosition") \ template(com_oracle_graal_api_code_DebugInfo, "com/oracle/graal/api/code/DebugInfo") \
--- a/src/share/vm/code/nmethod.cpp Wed Apr 16 17:57:11 2014 +0200 +++ b/src/share/vm/code/nmethod.cpp Wed Apr 16 19:07:21 2014 +0200 @@ -1330,7 +1330,7 @@ // Java wrapper is no longer alive. Here we need to clear out this weak // reference to the dead object. if (_graal_installed_code != NULL) { - HotSpotInstalledCode::set_codeBlob(_graal_installed_code, 0); + InstalledCode::set_address(_graal_installed_code, 0); _graal_installed_code = NULL; } #endif @@ -1510,8 +1510,8 @@ } #ifdef GRAAL if (_graal_installed_code != NULL) { - // Break the link between nmethod and HotSpotInstalledCode such that the nmethod can subsequently be flushed safely. - HotSpotInstalledCode::set_codeBlob(_graal_installed_code, 0); + // Break the link between nmethod and InstalledCode such that the nmethod can subsequently be flushed safely. + InstalledCode::set_address(_graal_installed_code, 0); } #endif @@ -1738,7 +1738,7 @@ #ifdef GRAAL // Follow Graal method if (_graal_installed_code != NULL) { - if (HotSpotNmethod::isDefault(_graal_installed_code)) { + if (_graal_installed_code->is_a(HotSpotNmethod::klass()) && HotSpotNmethod::isDefault(_graal_installed_code)) { if (!is_alive->do_object_b(_graal_installed_code)) { _graal_installed_code = NULL; }
--- a/src/share/vm/graal/graalCompilerToVM.cpp Wed Apr 16 17:57:11 2014 +0200 +++ b/src/share/vm/graal/graalCompilerToVM.cpp Wed Apr 16 19:07:21 2014 +0200 @@ -210,6 +210,7 @@ #undef set_boolean #undef set_int #undef set_long +#undef set_address C2V_END @@ -530,15 +531,16 @@ assert(cb == NULL, "should be"); } else { if (!installed_code_handle.is_null()) { - assert(installed_code_handle->is_a(HotSpotInstalledCode::klass()), "wrong type"); - HotSpotInstalledCode::set_codeBlob(installed_code_handle, (jlong) cb); + assert(installed_code_handle->is_a(InstalledCode::klass()), "wrong type"); + InstalledCode::set_address(installed_code_handle, (jlong) cb); + InstalledCode::set_version(installed_code_handle, InstalledCode::version(installed_code_handle) + 1); oop comp_result = HotSpotCompiledCode::comp(compiled_code_handle); if (comp_result->is_a(ExternalCompilationResult::klass())) { if (TraceGPUInteraction) { tty->print_cr("installCode0: ExternalCompilationResult"); } HotSpotInstalledCode::set_codeStart(installed_code_handle, ExternalCompilationResult::entryPoint(comp_result)); - } else { + } else if (installed_code_handle->is_a(HotSpotInstalledCode::klass())) { HotSpotInstalledCode::set_size(installed_code_handle, cb->size()); HotSpotInstalledCode::set_codeStart(installed_code_handle, (jlong) cb->code_begin()); HotSpotInstalledCode::set_codeSize(installed_code_handle, cb->code_size()); @@ -560,8 +562,10 @@ stats->_standard.update(timer, processedBytecodes); } Handle installed_code_handle = JNIHandles::resolve(installed_code); - stats->_nmethods_size += HotSpotInstalledCode::size(installed_code_handle); - stats->_nmethods_code_size += HotSpotInstalledCode::codeSize(installed_code_handle); + if (installed_code_handle->is_a(HotSpotInstalledCode::klass())) { + stats->_nmethods_size += HotSpotInstalledCode::size(installed_code_handle); + stats->_nmethods_code_size += HotSpotInstalledCode::codeSize(installed_code_handle); + } if (CITimeEach) { methodHandle method = asMethod(HotSpotResolvedJavaMethod::metaspaceMethod(hotspot_method)); @@ -633,7 +637,7 @@ ResourceMark rm; HandleMark hm; - jlong nmethodValue = HotSpotInstalledCode::codeBlob(hotspotInstalledCode); + jlong nmethodValue = InstalledCode::address(hotspotInstalledCode); if (nmethodValue == 0L) { THROW_(vmSymbols::com_oracle_graal_api_code_InvalidInstalledCodeException(), NULL); } @@ -724,14 +728,14 @@ C2V_VMENTRY(void, invalidateInstalledCode, (JNIEnv *env, jobject, jobject hotspotInstalledCode)) - jlong nativeMethod = HotSpotInstalledCode::codeBlob(hotspotInstalledCode); + jlong nativeMethod = InstalledCode::address(hotspotInstalledCode); nmethod* m = (nmethod*)nativeMethod; if (m != NULL && !m->is_not_entrant()) { m->mark_for_deoptimization(); VM_Deoptimize op; VMThread::execute(&op); } - HotSpotInstalledCode::set_codeBlob(hotspotInstalledCode, 0); + InstalledCode::set_address(hotspotInstalledCode, 0); C2V_END C2V_VMENTRY(jobject, getJavaMirror, (JNIEnv *env, jobject, jlong metaspace_klass)) @@ -1040,7 +1044,7 @@ #define RESOLVED_METHOD "Lcom/oracle/graal/api/meta/ResolvedJavaMethod;" #define HS_COMPILED_CODE "Lcom/oracle/graal/hotspot/HotSpotCompiledCode;" #define HS_CONFIG "Lcom/oracle/graal/hotspot/HotSpotVMConfig;" -#define HS_INSTALLED_CODE "Lcom/oracle/graal/hotspot/meta/HotSpotInstalledCode;" +#define INSTALLED_CODE "Lcom/oracle/graal/api/code/InstalledCode;" #define NODE_CLASS "Lcom/oracle/graal/graph/NodeClass;" #define HS_STACK_FRAME_REF "Lcom/oracle/graal/hotspot/HotSpotStackFrameReference;" #define METASPACE_KLASS "J" @@ -1080,17 +1084,17 @@ {CC"getMaxCallTargetOffset", CC"(J)J", FN_PTR(getMaxCallTargetOffset)}, {CC"getMetaspaceMethod", CC"("CLASS"I)"METASPACE_METHOD, FN_PTR(getMetaspaceMethod)}, {CC"initializeConfiguration", CC"("HS_CONFIG")V", FN_PTR(initializeConfiguration)}, - {CC"installCode0", CC"("HS_COMPILED_CODE HS_INSTALLED_CODE SPECULATION_LOG")I", FN_PTR(installCode0)}, - {CC"notifyCompilationStatistics", CC"(I"HS_RESOLVED_METHOD"ZIJJ"HS_INSTALLED_CODE")V", FN_PTR(notifyCompilationStatistics)}, + {CC"installCode0", CC"("HS_COMPILED_CODE INSTALLED_CODE SPECULATION_LOG")I", FN_PTR(installCode0)}, + {CC"notifyCompilationStatistics", CC"(I"HS_RESOLVED_METHOD"ZIJJ"INSTALLED_CODE")V", FN_PTR(notifyCompilationStatistics)}, {CC"printCompilationStatistics", CC"(ZZ)V", FN_PTR(printCompilationStatistics)}, {CC"resetCompilationStatistics", CC"()V", FN_PTR(resetCompilationStatistics)}, {CC"disassembleCodeBlob", CC"(J)"STRING, FN_PTR(disassembleCodeBlob)}, - {CC"executeCompiledMethodVarargs", CC"(["OBJECT HS_INSTALLED_CODE")"OBJECT, FN_PTR(executeCompiledMethodVarargs)}, + {CC"executeCompiledMethodVarargs", CC"(["OBJECT INSTALLED_CODE")"OBJECT, FN_PTR(executeCompiledMethodVarargs)}, {CC"getLineNumberTable", CC"("METASPACE_METHOD")[J", FN_PTR(getLineNumberTable)}, {CC"getLocalVariableTableStart", CC"("METASPACE_METHOD")J", FN_PTR(getLocalVariableTableStart)}, {CC"getLocalVariableTableLength", CC"("METASPACE_METHOD")I", FN_PTR(getLocalVariableTableLength)}, {CC"reprofile", CC"("METASPACE_METHOD")V", FN_PTR(reprofile)}, - {CC"invalidateInstalledCode", CC"("HS_INSTALLED_CODE")V", FN_PTR(invalidateInstalledCode)}, + {CC"invalidateInstalledCode", CC"("INSTALLED_CODE")V", FN_PTR(invalidateInstalledCode)}, {CC"getJavaMirror", CC"("METASPACE_KLASS")"CLASS, FN_PTR(getJavaMirror)}, {CC"readUnsafeKlassPointer", CC"("OBJECT")J", FN_PTR(readUnsafeKlassPointer)}, {CC"collectCounters", CC"()[J", FN_PTR(collectCounters)},
--- a/src/share/vm/graal/graalEnv.cpp Wed Apr 16 17:57:11 2014 +0200 +++ b/src/share/vm/graal/graalEnv.cpp Wed Apr 16 19:07:21 2014 +0200 @@ -515,7 +515,7 @@ // (Put nm into the task handle *before* publishing to the Java heap.) if (task != NULL) task->set_code(nm); - if (HotSpotNmethod::isDefault(installed_code())) { + if (installed_code->is_a(HotSpotNmethod::klass()) && HotSpotNmethod::isDefault(installed_code())) { if (entry_bci == InvocationEntryBci) { if (TieredCompilation) { // If there is an old version we're done with it
--- a/src/share/vm/graal/graalJavaAccess.cpp Wed Apr 16 17:57:11 2014 +0200 +++ b/src/share/vm/graal/graalJavaAccess.cpp Wed Apr 16 19:07:21 2014 +0200 @@ -63,7 +63,7 @@ void graal_compute_offsets() { COMPILER_CLASSES_DO(START_CLASS, END_CLASS, CHAR_FIELD, INT_FIELD, BOOLEAN_FIELD, LONG_FIELD, FLOAT_FIELD, OOP_FIELD, STATIC_OOP_FIELD) - guarantee(HotSpotInstalledCode::_codeBlob_offset == sizeof(oopDesc), "codeBlob must be first field!"); + guarantee(InstalledCode::_address_offset == sizeof(oopDesc), "codeBlob must be first field!"); } #define EMPTY0
--- a/src/share/vm/graal/graalJavaAccess.hpp Wed Apr 16 17:57:11 2014 +0200 +++ b/src/share/vm/graal/graalJavaAccess.hpp Wed Apr 16 19:07:21 2014 +0200 @@ -49,7 +49,7 @@ #define COMPILER_CLASSES_DO(start_class, end_class, char_field, int_field, boolean_field, long_field, float_field, oop_field, static_oop_field) \ start_class(HotSpotResolvedObjectType) \ - oop_field(HotSpotResolvedObjectType, javaClass, "Ljava/lang/Class;") \ + oop_field(HotSpotResolvedObjectType, javaClass, "Ljava/lang/Class;") \ end_class \ start_class(HotSpotResolvedJavaMethod) \ oop_field(HotSpotResolvedJavaMethod, name, "Ljava/lang/String;") \ @@ -59,8 +59,11 @@ start_class(HotSpotJavaType) \ oop_field(HotSpotJavaType, name, "Ljava/lang/String;") \ end_class \ + start_class(InstalledCode) \ + long_field(InstalledCode, address) \ + long_field(InstalledCode, version) \ + end_class \ start_class(HotSpotInstalledCode) \ - long_field(HotSpotInstalledCode, codeBlob) \ int_field(HotSpotInstalledCode, size) \ long_field(HotSpotInstalledCode, codeStart) \ int_field(HotSpotInstalledCode, codeSize) \
--- a/src/share/vm/runtime/deoptimization.cpp Wed Apr 16 17:57:11 2014 +0200 +++ b/src/share/vm/runtime/deoptimization.cpp Wed Apr 16 19:07:21 2014 +0200 @@ -1485,7 +1485,10 @@ #ifdef GRAAL oop installedCode = nm->graal_installed_code(); if (installedCode != NULL) { - oop installedCodeName = HotSpotNmethod::name(installedCode); + oop installedCodeName = NULL; + if (installedCode->is_a(HotSpotNmethod::klass())) { + installedCodeName = HotSpotNmethod::name(installedCode); + } if (installedCodeName != NULL) { tty->print(" (Graal: installedCodeName=%s) ", java_lang_String::as_utf8_string(installedCodeName)); } else {
--- a/src/share/vm/runtime/javaCalls.cpp Wed Apr 16 17:57:11 2014 +0200 +++ b/src/share/vm/runtime/javaCalls.cpp Wed Apr 16 19:07:21 2014 +0200 @@ -412,7 +412,7 @@ if (nm->is_alive()) { ((JavaThread*) THREAD)->set_graal_alternate_call_target(nm->verified_entry_point()); oop graalInstalledCode = nm->graal_installed_code(); - if (graalInstalledCode != NULL && HotSpotNmethod::isExternal(graalInstalledCode)) { + if (graalInstalledCode != NULL && graalInstalledCode->is_a(HotSpotNmethod::klass()) && HotSpotNmethod::isExternal(graalInstalledCode)) { entry_point = GraalCompiler::instance()->get_external_deopt_i2c_entry(); } else { entry_point = method->adapter()->get_i2c_entry();