@Uninterruptible(reason = "Operates on raw pointers to objects") private void writeObjectConstantsToCode(ObjectConstantsHolder objectConstants) { for (int i = 0; i < objectConstants.count; i++) { objectConstants.patchers[i].patchData(code, objectConstants.values[i]); } /* From now on the constantsWalker will operate on the constants area. */ constantsWalker.pointerMapValid = true; }
private void patchData(Map<Integer, NativeImagePatcher> patcher, @SuppressWarnings("unused") ObjectConstantsHolder objectConstants) { for (DataPatch dataPatch : compilation.getDataPatches()) { NativeImagePatcher patch = patcher.get(dataPatch.pcOffset); if (dataPatch.reference instanceof DataSectionReference) { DataSectionReference ref = (DataSectionReference) dataPatch.reference; int pcDisplacement = constantsOffset + ref.getOffset() - dataPatch.pcOffset; patch.patch(dataPatch.pcOffset, pcDisplacement, compiledBytes); } else if (dataPatch.reference instanceof ConstantReference) { ConstantReference ref = (ConstantReference) dataPatch.reference; SubstrateObjectConstant refConst = (SubstrateObjectConstant) ref.getConstant(); objectConstants.add(patch, refConst); } } }
void add(NativeImagePatcher patchingAnnotation, SubstrateObjectConstant constant) { assert constant.isCompressed() == ReferenceAccess.singleton().haveCompressedReferences() : "Object reference constants in code must be compressed"; patchers[count] = patchingAnnotation; values[count] = KnownIntrinsics.convertUnknownValue(constant.getObject(), Object.class); referenceMap.markReferenceAtOffset(patchingAnnotation.getPosition(), true); count++; } }
patches.get(call.pcOffset).patch(call.pcOffset, (int) pcDisplacement, compiledBytes);