< prev index next >

src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotCodeCacheProvider.java

Print this page

        

*** 20,38 **** * or visit www.oracle.com if you need additional information or have any * questions. */ package jdk.vm.ci.hotspot; ! import static jdk.vm.ci.hotspot.HotSpotCompressedNullConstant.*; ! import java.lang.reflect.*; ! import jdk.vm.ci.code.*; ! import jdk.vm.ci.code.CompilationResult.*; ! import jdk.vm.ci.code.DataSection.*; ! import jdk.vm.ci.common.*; ! import jdk.vm.ci.meta.*; /** * HotSpot implementation of {@link CodeCacheProvider}. */ public class HotSpotCodeCacheProvider implements CodeCacheProvider { --- 20,53 ---- * or visit www.oracle.com if you need additional information or have any * questions. */ package jdk.vm.ci.hotspot; ! import static jdk.vm.ci.hotspot.HotSpotCompressedNullConstant.COMPRESSED_NULL; ! import java.lang.reflect.Field; ! import jdk.vm.ci.code.BailoutException; ! import jdk.vm.ci.code.CodeCacheProvider; ! import jdk.vm.ci.code.CompilationRequest; ! import jdk.vm.ci.code.CompilationResult; ! import jdk.vm.ci.code.CompilationResult.Call; ! import jdk.vm.ci.code.CompilationResult.ConstantReference; ! import jdk.vm.ci.code.CompilationResult.DataPatch; ! import jdk.vm.ci.code.CompilationResult.Mark; ! import jdk.vm.ci.code.DataSection; ! import jdk.vm.ci.code.DataSection.Data; ! import jdk.vm.ci.code.DataSection.DataBuilder; ! import jdk.vm.ci.code.InstalledCode; ! import jdk.vm.ci.code.RegisterConfig; ! import jdk.vm.ci.code.TargetDescription; ! import jdk.vm.ci.common.JVMCIError; ! import jdk.vm.ci.meta.Constant; ! import jdk.vm.ci.meta.JavaConstant; ! import jdk.vm.ci.meta.SerializableConstant; ! import jdk.vm.ci.meta.SpeculationLog; ! import jdk.vm.ci.meta.VMConstant; /** * HotSpot implementation of {@link CodeCacheProvider}. */ public class HotSpotCodeCacheProvider implements CodeCacheProvider {
*** 96,171 **** @Override public int getMinimumOutgoingSize() { return runtime.getConfig().runtimeCallStackSize; } ! public InstalledCode logOrDump(InstalledCode installedCode, CompilationResult compResult) { ! HotSpotJVMCIRuntime.runtime().notifyInstall(this, installedCode, compResult); return installedCode; } ! private InstalledCode installCode(CompilationResult compResult, HotSpotCompiledNmethod compiledCode, InstalledCode installedCode, SpeculationLog log) { ! int result = runtime.getCompilerToVM().installCode(target, compiledCode, installedCode, log); if (result != config.codeInstallResultOk) { - String msg = compiledCode.getInstallationFailureMessage(); String resultDesc = config.getCodeInstallResultDescription(result); if (msg != null) { msg = String.format("Code installation failed: %s%n%s", resultDesc, msg); } else { msg = String.format("Code installation failed: %s", resultDesc); } if (result == config.codeInstallResultDependenciesInvalid) { throw new AssertionError(resultDesc + " " + msg); } throw new BailoutException(result != config.codeInstallResultDependenciesFailed, msg); } - return logOrDump(installedCode, compResult); - } - - public InstalledCode installMethod(HotSpotResolvedJavaMethod method, CompilationResult compResult, long jvmciEnv, boolean isDefault) { - if (compResult.getId() == -1) { - compResult.setId(method.allocateCompileId(compResult.getEntryBCI())); - } - HotSpotInstalledCode installedCode = new HotSpotNmethod(method, compResult.getName(), isDefault); - HotSpotCompiledNmethod compiledCode = new HotSpotCompiledNmethod(method, compResult, jvmciEnv); - return installCode(compResult, compiledCode, installedCode, method.getSpeculationLog()); - } - - @Override - 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())); - } - InstalledCode installedCode = predefinedInstalledCode; - if (installedCode == null) { - HotSpotInstalledCode code = new HotSpotNmethod(hotspotMethod, compResult.getName(), false); - installedCode = code; - } - HotSpotCompiledNmethod compiledCode = new HotSpotCompiledNmethod(hotspotMethod, compResult); - return installCode(compResult, compiledCode, installedCode, log); } ! ! @Override ! public InstalledCode setDefaultMethod(ResolvedJavaMethod method, CompilationResult compResult) { ! HotSpotResolvedJavaMethod hotspotMethod = (HotSpotResolvedJavaMethod) method; ! return installMethod(hotspotMethod, compResult, 0L, true); } ! public HotSpotNmethod addExternalMethod(ResolvedJavaMethod method, CompilationResult compResult) { ! HotSpotResolvedJavaMethod javaMethod = (HotSpotResolvedJavaMethod) method; ! if (compResult.getId() == -1) { ! compResult.setId(javaMethod.allocateCompileId(compResult.getEntryBCI())); ! } ! HotSpotNmethod code = new HotSpotNmethod(javaMethod, compResult.getName(), false, true); ! HotSpotCompiledNmethod compiled = new HotSpotCompiledNmethod(javaMethod, compResult); ! CompilerToVM vm = runtime.getCompilerToVM(); ! int result = vm.installCode(target, compiled, code, null); ! if (result != runtime.getConfig().codeInstallResultOk) { ! return null; ! } ! return code; } public boolean needsDataPatch(JavaConstant constant) { return constant instanceof HotSpotMetaspaceConstant; } --- 111,178 ---- @Override public int getMinimumOutgoingSize() { return runtime.getConfig().runtimeCallStackSize; } ! private InstalledCode logOrDump(InstalledCode installedCode, CompilationResult compResult) { ! ((HotSpotJVMCIRuntime) runtime).notifyInstall(this, installedCode, compResult); return installedCode; } ! public InstalledCode installCode(CompilationRequest compRequest, CompilationResult compResult, InstalledCode installedCode, SpeculationLog log, boolean isDefault) { ! HotSpotResolvedJavaMethod method = compRequest != null ? (HotSpotResolvedJavaMethod) compRequest.getMethod() : null; ! InstalledCode resultInstalledCode; ! if (installedCode == null) { ! if (method == null) { ! // Must be a stub ! resultInstalledCode = new HotSpotRuntimeStub(compResult.getName()); ! } else { ! resultInstalledCode = new HotSpotNmethod(method, compResult.getName(), isDefault); ! } ! } else { ! resultInstalledCode = installedCode; ! } ! HotSpotCompiledCode compiledCode; ! if (method != null) { ! final int id; ! final long jvmciEnv; ! if (compRequest instanceof HotSpotCompilationRequest) { ! HotSpotCompilationRequest hsCompRequest = (HotSpotCompilationRequest) compRequest; ! id = hsCompRequest.getId(); ! jvmciEnv = hsCompRequest.getJvmciEnv(); ! } else { ! id = method.allocateCompileId(compRequest.getEntryBCI()); ! jvmciEnv = 0L; ! } ! compiledCode = new HotSpotCompiledNmethod(method, compResult, id, jvmciEnv); ! } else { ! compiledCode = new HotSpotCompiledCode(compResult); ! } ! int result = runtime.getCompilerToVM().installCode(target, compiledCode, resultInstalledCode, (HotSpotSpeculationLog) log); if (result != config.codeInstallResultOk) { String resultDesc = config.getCodeInstallResultDescription(result); + if (compiledCode instanceof HotSpotCompiledNmethod) { + HotSpotCompiledNmethod compiledNmethod = (HotSpotCompiledNmethod) compiledCode; + String msg = compiledNmethod.getInstallationFailureMessage(); if (msg != null) { msg = String.format("Code installation failed: %s%n%s", resultDesc, msg); } else { msg = String.format("Code installation failed: %s", resultDesc); } if (result == config.codeInstallResultDependenciesInvalid) { throw new AssertionError(resultDesc + " " + msg); } throw new BailoutException(result != config.codeInstallResultDependenciesFailed, msg); + } else { + throw new BailoutException("Error installing %s: %s", compResult.getName(), resultDesc); } } ! return logOrDump(resultInstalledCode, compResult); } ! public void invalidateInstalledCode(InstalledCode installedCode) { ! runtime.getCompilerToVM().invalidateInstalledCode(installedCode); } public boolean needsDataPatch(JavaConstant constant) { return constant instanceof HotSpotMetaspaceConstant; }
*** 174,212 **** int size; DataBuilder builder; if (constant instanceof VMConstant) { VMConstant vmConstant = (VMConstant) constant; boolean compressed; ! long raw; ! if (constant instanceof HotSpotObjectConstant) { ! HotSpotObjectConstant c = (HotSpotObjectConstant) vmConstant; compressed = c.isCompressed(); - raw = 0xDEADDEADDEADDEADL; - } else if (constant instanceof HotSpotMetaspaceConstant) { - HotSpotMetaspaceConstant meta = (HotSpotMetaspaceConstant) constant; - compressed = meta.isCompressed(); - raw = meta.rawValue(); } else { throw new JVMCIError(String.valueOf(constant)); } ! size = target.getSizeInBytes(compressed ? JavaKind.Int : target.wordKind); if (size == 4) { builder = (buffer, patch) -> { patch.accept(new DataPatch(buffer.position(), new ConstantReference(vmConstant))); ! buffer.putInt((int) raw); }; } else { assert size == 8; builder = (buffer, patch) -> { patch.accept(new DataPatch(buffer.position(), new ConstantReference(vmConstant))); ! buffer.putLong(raw); }; } } else if (JavaConstant.isNull(constant)) { boolean compressed = COMPRESSED_NULL.equals(constant); ! size = target.getSizeInBytes(compressed ? JavaKind.Int : target.wordKind); builder = DataBuilder.zero(size); } else if (constant instanceof SerializableConstant) { SerializableConstant s = (SerializableConstant) constant; size = s.getSerializedSize(); builder = DataBuilder.serializable(s); --- 181,213 ---- int size; DataBuilder builder; if (constant instanceof VMConstant) { VMConstant vmConstant = (VMConstant) constant; boolean compressed; ! if (constant instanceof HotSpotConstant) { ! HotSpotConstant c = (HotSpotConstant) vmConstant; compressed = c.isCompressed(); } else { throw new JVMCIError(String.valueOf(constant)); } ! size = compressed ? 4 : target.wordSize; if (size == 4) { builder = (buffer, patch) -> { patch.accept(new DataPatch(buffer.position(), new ConstantReference(vmConstant))); ! buffer.putInt(0xDEADDEAD); }; } else { assert size == 8; builder = (buffer, patch) -> { patch.accept(new DataPatch(buffer.position(), new ConstantReference(vmConstant))); ! buffer.putLong(0xDEADDEADDEADDEADL); }; } } else if (JavaConstant.isNull(constant)) { boolean compressed = COMPRESSED_NULL.equals(constant); ! size = compressed ? 4 : target.wordSize; builder = DataBuilder.zero(size); } else if (constant instanceof SerializableConstant) { SerializableConstant s = (SerializableConstant) constant; size = s.getSerializedSize(); builder = DataBuilder.serializable(s);
*** 248,262 **** return target; } public String disassemble(InstalledCode code) { if (code.isValid()) { ! long codeBlob = code.getAddress(); ! return runtime.getCompilerToVM().disassembleCodeBlob(codeBlob); } return null; } public SpeculationLog createSpeculationLog() { return new HotSpotSpeculationLog(); } } --- 249,293 ---- return target; } public String disassemble(InstalledCode code) { if (code.isValid()) { ! return runtime.getCompilerToVM().disassembleCodeBlob(code); } return null; } public SpeculationLog createSpeculationLog() { return new HotSpotSpeculationLog(); } + + public long getMaxCallTargetOffset(long address) { + return runtime.getCompilerToVM().getMaxCallTargetOffset(address); + } + + public boolean shouldDebugNonSafepoints() { + return runtime.getCompilerToVM().shouldDebugNonSafepoints(); + } + + /** + * Notifies the VM of statistics for a completed compilation. + * + * @param id the identifier of the compilation + * @param method the method compiled + * @param osr specifies if the compilation was for on-stack-replacement + * @param processedBytecodes the number of bytecodes processed during the compilation, including + * the bytecodes of all inlined methods + * @param time the amount time spent compiling {@code method} + * @param timeUnitsPerSecond the granularity of the units for the {@code time} value + * @param installedCode the nmethod installed as a result of the compilation + */ + public void notifyCompilationStatistics(int id, HotSpotResolvedJavaMethod method, boolean osr, int processedBytecodes, long time, long timeUnitsPerSecond, InstalledCode installedCode) { + runtime.getCompilerToVM().notifyCompilationStatistics(id, (HotSpotResolvedJavaMethodImpl) method, osr, processedBytecodes, time, timeUnitsPerSecond, installedCode); + } + + /** + * Resets all compilation statistics. + */ + public void resetCompilationStatistics() { + runtime.getCompilerToVM().resetCompilationStatistics(); + } }
< prev index next >