Skip to content

Commit

Permalink
Use custom meta access with the object scanner
Browse files Browse the repository at this point in the history
This allows using the object scanner also after analysis, i.e., with the HostedMetaAccess.
  • Loading branch information
cstancu committed Sep 7, 2023
1 parent 6e49210 commit 59751ac
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import com.oracle.graal.pointsto.heap.HeapSnapshotVerifier;
import com.oracle.graal.pointsto.heap.ImageHeap;
import com.oracle.graal.pointsto.heap.ImageHeapScanner;
import com.oracle.graal.pointsto.infrastructure.UniverseMetaAccess;
import com.oracle.graal.pointsto.standalone.StandaloneObjectScanner;
import com.oracle.graal.pointsto.util.CompletionExecutor;

Expand All @@ -40,7 +41,7 @@ public StandaloneHeapSnapshotVerifier(BigBang bb, ImageHeap imageHeap, ImageHeap
}

@Override
protected ObjectScanner installObjectScanner(CompletionExecutor executor) {
protected ObjectScanner installObjectScanner(UniverseMetaAccess metaAccess, CompletionExecutor executor) {
StandaloneImageHeapScanner standaloneImageHeapScanner = (StandaloneImageHeapScanner) this.scanner;
return new StandaloneObjectScanner(bb, executor, scannedObjects, new ScanningObserver(), standaloneImageHeapScanner.getShouldScanConstant(),
standaloneImageHeapScanner.getShouldScanField());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ public void runAnalysis(DebugContext debugContext, Function<AnalysisUniverse, Bo
private boolean analysisModified() {
boolean analysisModified;
try (Timer.StopTimer ignored = verifyHeapTimer.start()) {
analysisModified = universe.getHeapVerifier().checkHeapSnapshot(executor, "after analysis", true);
analysisModified = universe.getHeapVerifier().checkHeapSnapshot(metaAccess, executor, "after analysis", true);
}
/* Initialize for the next iteration. */
executor.init(getTiming());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,8 @@ protected void scanField(AnalysisField field, JavaConstant receiver, ScanReason
return;
}
assert isUnwrapped(receiver);
JavaConstant fieldValue = bb.getUniverse().getHeapScanner().readFieldValue(field, receiver);

JavaConstant fieldValue = readFieldValue(field, receiver);
if (fieldValue == null) {
StringBuilder backtrace = new StringBuilder();
buildObjectBacktrace(bb, reason, backtrace);
Expand Down Expand Up @@ -189,6 +190,10 @@ protected void scanField(AnalysisField field, JavaConstant receiver, ScanReason
}
}

protected JavaConstant readFieldValue(AnalysisField field, JavaConstant receiver) {
return bb.getConstantReflectionProvider().readFieldValue(field, receiver);
}

/**
* Must unwrap the receiver if it is an ImageHeapConstant to scan the hosted value, if any, for
* verification, otherwise the verification just compares shadow heap with shadow heap for
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
import com.oracle.graal.pointsto.ObjectScanner;
import com.oracle.graal.pointsto.ObjectScanner.ReusableSet;
import com.oracle.graal.pointsto.ObjectScanningObserver;
import com.oracle.graal.pointsto.infrastructure.UniverseMetaAccess;
import com.oracle.graal.pointsto.meta.AnalysisField;
import com.oracle.graal.pointsto.meta.AnalysisType;
import com.oracle.graal.pointsto.util.AnalysisError;
Expand Down Expand Up @@ -79,7 +80,7 @@ public boolean checkHeapSnapshot(UniverseMetaAccess metaAccess, CompletionExecut
int reachableTypesBefore = bb.getUniverse().getReachableTypes();
iterations++;
scannedObjects.reset();
ObjectScanner objectScanner = installObjectScanner(executor);
ObjectScanner objectScanner = installObjectScanner(metaAccess, executor);
executor.start();
scanTypes(objectScanner);
objectScanner.scanBootImageHeapRoots();
Expand Down Expand Up @@ -114,7 +115,7 @@ public boolean checkHeapSnapshot(UniverseMetaAccess metaAccess, CompletionExecut
return analysisModified || verificationReachableTypes > 0;
}

protected ObjectScanner installObjectScanner(CompletionExecutor executor) {
protected ObjectScanner installObjectScanner(@SuppressWarnings("unused") UniverseMetaAccess metaAccess, CompletionExecutor executor) {
return new ObjectScanner(bb, executor, scannedObjects, new ScanningObserver());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,16 @@

import com.oracle.graal.pointsto.BigBang;
import com.oracle.graal.pointsto.ObjectScanner;
import com.oracle.graal.pointsto.ObjectScanningObserver;
import com.oracle.graal.pointsto.heap.HeapSnapshotVerifier;
import com.oracle.graal.pointsto.heap.ImageHeap;
import com.oracle.graal.pointsto.heap.ImageHeapScanner;
import com.oracle.graal.pointsto.infrastructure.UniverseMetaAccess;
import com.oracle.graal.pointsto.meta.AnalysisField;
import com.oracle.graal.pointsto.meta.AnalysisType;
import com.oracle.graal.pointsto.util.CompletionExecutor;
import com.oracle.svm.hosted.SVMHost;
import com.oracle.svm.hosted.ameta.AnalysisConstantReflectionProvider;

import jdk.vm.ci.meta.JavaConstant;

Expand All @@ -43,8 +47,8 @@ public SVMImageHeapVerifier(BigBang bb, ImageHeap imageHeap, ImageHeapScanner sc
}

@Override
public boolean checkHeapSnapshot(CompletionExecutor executor, String phase, boolean forAnalysis) {
return super.checkHeapSnapshot(executor, phase, forAnalysis) || imageStateModified();
public boolean checkHeapSnapshot(UniverseMetaAccess metaAccess, CompletionExecutor executor, String phase, boolean forAnalysis) {
return super.checkHeapSnapshot(metaAccess, executor, phase, forAnalysis) || imageStateModified();
}

/**
Expand Down Expand Up @@ -75,6 +79,26 @@ private void verifyHub(SVMHost svmHost, ObjectScanner objectScanner, AnalysisTyp
objectScanner.scanConstant(hubConstant, ObjectScanner.OtherReason.HUB);
}

@Override
protected ObjectScanner installObjectScanner(UniverseMetaAccess metaAccess, CompletionExecutor executor) {
return new VerifierObjectScanner(bb, metaAccess, executor, scannedObjects, new ScanningObserver());
}

private static final class VerifierObjectScanner extends ObjectScanner {
private final UniverseMetaAccess metaAccess;

VerifierObjectScanner(BigBang bb, UniverseMetaAccess metaAccess, CompletionExecutor executor, ReusableSet scannedObjects, ObjectScanningObserver scanningObserver) {
super(bb, executor, scannedObjects, scanningObserver);
this.metaAccess = metaAccess;
}

@Override
protected JavaConstant readFieldValue(AnalysisField field, JavaConstant receiver) {
AnalysisConstantReflectionProvider constantReflectionProvider = (AnalysisConstantReflectionProvider) bb.getConstantReflectionProvider();
return constantReflectionProvider.readValue(metaAccess, field, receiver, true);
}
}

private SVMHost svmHost() {
return (SVMHost) bb.getHostVM();
}
Expand Down

0 comments on commit 59751ac

Please sign in to comment.