Skip to content

Commit

Permalink
Unify the places that prepare ImageHeapConstant for runtime compilation.
Browse files Browse the repository at this point in the history
  • Loading branch information
cstancu committed Jan 31, 2024
1 parent c229b57 commit e6a0a96
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,20 @@
import java.util.EnumMap;
import java.util.Map;

import org.graalvm.nativeimage.ImageSingletons;

import com.oracle.graal.pointsto.heap.ImageHeapConstant;
import com.oracle.svm.core.CPUFeatureAccess;
import com.oracle.svm.core.SubstrateUtil;
import com.oracle.svm.core.graal.code.SubstrateCompilationIdentifier;
import com.oracle.svm.core.graal.code.SubstrateCompilationResult;
import com.oracle.svm.core.graal.meta.RuntimeConfiguration;
import com.oracle.svm.core.meta.SharedMethod;
import com.oracle.svm.core.meta.SubstrateObjectConstant;
import com.oracle.svm.core.option.RuntimeOptionKey;
import com.oracle.svm.core.util.VMError;
import com.oracle.svm.graal.meta.SubstrateMethod;

import jdk.graal.compiler.code.CompilationResult;
import jdk.graal.compiler.core.CompilationWatchDog;
import jdk.graal.compiler.core.CompilationWrapper;
Expand All @@ -48,18 +62,8 @@
import jdk.graal.compiler.options.OptionValues;
import jdk.graal.compiler.phases.OptimisticOptimizations;
import jdk.graal.compiler.phases.tiers.Suites;
import org.graalvm.nativeimage.ImageSingletons;

import com.oracle.svm.core.CPUFeatureAccess;
import com.oracle.svm.core.SubstrateUtil;
import com.oracle.svm.core.graal.code.SubstrateCompilationIdentifier;
import com.oracle.svm.core.graal.code.SubstrateCompilationResult;
import com.oracle.svm.core.graal.meta.RuntimeConfiguration;
import com.oracle.svm.core.meta.SharedMethod;
import com.oracle.svm.core.option.RuntimeOptionKey;
import com.oracle.svm.graal.meta.SubstrateMethod;

import jdk.vm.ci.code.Architecture;
import jdk.vm.ci.meta.JavaConstant;

public class SubstrateGraalUtils {

Expand Down Expand Up @@ -188,4 +192,25 @@ private static CompilationResult compileGraph(RuntimeConfiguration runtimeConfig
}
}
}

/** Prepares a hosted {@link JavaConstant} for runtime compilation. */
public static JavaConstant forRuntimeCompilation(JavaConstant constant) {
if (constant instanceof ImageHeapConstant heapConstant) {
return forRuntimeCompilation(heapConstant);
}
return constant;
}

/**
* Prepares a hosted {@link ImageHeapConstant} for runtime compilation. For now this simply
* returns the hosted object which already is a {@link SubstrateObjectConstant}. When the
* {@link ImageHeapConstant} will reference a HotSpot constant directly (GR-50240), this code
* will have to do its own wrapping.
*/
public static JavaConstant forRuntimeCompilation(ImageHeapConstant heapConstant) {
JavaConstant hostedObject = heapConstant.getHostedObject();
VMError.guarantee(hostedObject instanceof SubstrateObjectConstant, "Expected to find SubstrateObjectConstant, found %s", heapConstant);
return hostedObject;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
import com.oracle.svm.core.util.ObservableImageHeapMapProvider;
import com.oracle.svm.core.util.VMError;
import com.oracle.svm.graal.SubstrateGraalRuntime;
import com.oracle.svm.graal.SubstrateGraalUtils;
import com.oracle.svm.graal.TruffleRuntimeCompilationSupport;
import com.oracle.svm.graal.meta.SubstrateField;
import com.oracle.svm.graal.meta.SubstrateMethod;
Expand Down Expand Up @@ -202,8 +203,7 @@ public Object apply(Object source) {
} else if (source instanceof FieldLocationIdentity && !(source instanceof SubstrateFieldLocationIdentity)) {
dest = createFieldLocationIdentity((FieldLocationIdentity) source);
} else if (source instanceof ImageHeapConstant heapConstant) {
VMError.guarantee(heapConstant.isBackedByHostedObject(), "Expected to find a heap object backed by a hosted object, found %s", heapConstant);
dest = heapConstant.getHostedObject();
dest = SubstrateGraalUtils.forRuntimeCompilation(heapConstant);
}

assert dest != null;
Expand Down Expand Up @@ -458,19 +458,11 @@ public void updateSubstrateDataAfterCompilation(HostedUniverse hUniverse, Provid
JavaConstant constantValue = hField.isStatic() && ((HostedConstantFieldProvider) providers.getConstantFieldProvider()).isFinalField(hField, null)
? providers.getConstantReflection().readFieldValue(hField, null)
: null;
constantValue = unwrapConstant(constantValue);
constantValue = SubstrateGraalUtils.forRuntimeCompilation(constantValue);
sField.setSubstrateData(hField.getLocation(), hField.isAccessed(), hField.isWritten() || !hField.isValueAvailable(), constantValue);
}
}

static JavaConstant unwrapConstant(JavaConstant constant) {
if (constant instanceof ImageHeapConstant heapConstant) {
VMError.guarantee(heapConstant.isBackedByHostedObject(), "Expected to find a heap object backed by a hosted object, found %s", heapConstant);
return heapConstant.getHostedObject();
}
return constant;
}

public void updateSubstrateDataAfterHeapLayout(HostedUniverse hUniverse) {
for (Map.Entry<AnalysisMethod, SubstrateMethod> entry : methods.entrySet()) {
AnalysisMethod aMethod = entry.getKey();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
import com.oracle.svm.core.graal.nodes.ThrowBytecodeExceptionNode;
import com.oracle.svm.core.option.HostedOptionKey;
import com.oracle.svm.core.util.VMError;
import com.oracle.svm.graal.SubstrateGraalUtils;
import com.oracle.svm.hosted.HeapBreakdownProvider;
import com.oracle.svm.hosted.SVMHost;
import com.oracle.svm.hosted.ameta.AnalysisConstantFieldProvider;
Expand Down Expand Up @@ -368,25 +369,24 @@ public RuntimeCompilationGraphEncoder(Architecture architecture, ImageHeapScanne

@Override
protected void addObject(Object object) {
super.addObject(unwrap(object));
super.addObject(forRuntimeCompilation(object));
}

@Override
protected void writeObjectId(Object object) {
super.writeObjectId(unwrap(object));
super.writeObjectId(forRuntimeCompilation(object));
}

@Override
protected GraphDecoder graphDecoderForVerification(StructuredGraph decodedGraph) {
return new RuntimeCompilationGraphDecoder(architecture, decodedGraph, heapScanner);
}

private Object unwrap(Object object) {
if (object instanceof ImageHeapConstant ihc) {
VMError.guarantee(ihc.getHostedObject() != null);
return ihc.getHostedObject();
private Object forRuntimeCompilation(Object object) {
if (object instanceof ImageHeapConstant heapConstant) {
return SubstrateGraalUtils.forRuntimeCompilation(heapConstant);
} else if (object instanceof ObjectLocationIdentity oli && oli.getObject() instanceof ImageHeapConstant heapConstant) {
return locationIdentityCache.computeIfAbsent(heapConstant, (hc) -> ObjectLocationIdentity.create(hc.getHostedObject()));
return locationIdentityCache.computeIfAbsent(heapConstant, (hc) -> ObjectLocationIdentity.create(SubstrateGraalUtils.forRuntimeCompilation(hc)));
}
return object;
}
Expand Down

0 comments on commit e6a0a96

Please sign in to comment.