@Override @SuppressFBWarnings(value = {"BC_UNCONFIRMED_CAST"}, justification = "We know what we are doing.") public InstalledCode installCode(ResolvedJavaMethod method, CompiledCode compiledCode, InstalledCode predefinedInstalledCode, SpeculationLog log, boolean isDefault) { VMError.guarantee(!isDefault); SubstrateInstalledCode substrateInstalledCode; if (predefinedInstalledCode instanceof SubstrateInstalledCode.Access) { substrateInstalledCode = ((SubstrateInstalledCode.Access) predefinedInstalledCode).getSubstrateInstalledCode(); } else { substrateInstalledCode = (SubstrateInstalledCode) predefinedInstalledCode; } CompilationResult compResult = ((SubstrateCompiledCode) compiledCode).getCompilationResult(); InstalledCodeBuilder builder = new InstalledCodeBuilder((SharedRuntimeMethod) method, compResult, substrateInstalledCode, null); builder.install(); return predefinedInstalledCode; }
public void install() { this.installOperation(); }
patchData(patches, objectConstants); int updatedCodeSize = patchCalls(patches); assert updatedCodeSize <= constantsOffset; writeObjectConstantsToCode(objectConstants); createCodeChunkInfos(); throw rethrow(errorBox[0]);
code = allocateOSMemory(WordFactory.unsigned(tmpMemorySize), true); if (infopoint instanceof Call && ((Call) infopoint).direct) { Call call = (Call) infopoint; long targetAddress = getTargetCodeAddress(call); long pcDisplacement = targetAddress - (code.rawValue() + call.pcOffset); if (pcDisplacement != (int) pcDisplacement) { freeOSMemory(code, WordFactory.unsigned(tmpMemorySize)); code = allocateOSMemory(WordFactory.unsigned(tmpMemorySize), true);
if (infopoint instanceof Call && ((Call) infopoint).direct) { Call call = (Call) infopoint; long targetAddress = getTargetCodeAddress(call); long pcDisplacement = targetAddress - (code.rawValue() + call.pcOffset); if (pcDisplacement != (int) pcDisplacement || testTrampolineJumps) {
private long getTargetCodeAddress(Call callInfo) { // NOTE that for the moment, we don't make static calls to external // (e.g. native) functions. // This will change, and we will have to case-split here... but not yet. SharedMethod targetMethod = (SharedMethod) callInfo.target; long callTargetStart = CodeInfoTable.getImageCodeCache().absoluteIP(targetMethod.getCodeOffsetInImage()).rawValue(); if (allInstalledCode != null) { InstalledCodeBuilder targetInstalledCodeBuilder = allInstalledCode.get(targetMethod); if (targetInstalledCodeBuilder != null) { SubstrateInstalledCode targetInstalledCode = targetInstalledCodeBuilder.getInstalledCode(); if (targetInstalledCode != null && targetInstalledCode.isValid()) { callTargetStart = targetInstalledCode.getAddress(); } } } if (callTargetStart == 0) { throw VMError.shouldNotReachHere("target method not compiled: " + targetMethod.format("%H.%n(%p)")); } return callTargetStart; }
private static void installMethod(SubstrateMethod method, CompilationResult result, SubstrateInstalledCodeImpl installedCode, boolean testTrampolineJumps) { InstalledCodeBuilder installedCodeBuilder = new InstalledCodeBuilder(method, result, installedCode, null, testTrampolineJumps); installedCodeBuilder.install(); Log.log().string("Installed code for " + method.format("%H.%n(%p)") + ": " + result.getTargetCodeSize() + " bytes").newline(); }