From 59751ac73a230f69fc02b30c18781bfe609332c3 Mon Sep 17 00:00:00 2001 From: Codrut Stancu Date: Thu, 7 Sep 2023 15:16:15 +0200 Subject: [PATCH] Use custom meta access with the object scanner This allows using the object scanner also after analysis, i.e., with the HostedMetaAccess. --- .../heap/StandaloneHeapSnapshotVerifier.java | 3 +- .../pointsto/AbstractAnalysisEngine.java | 2 +- .../oracle/graal/pointsto/ObjectScanner.java | 7 ++++- .../pointsto/heap/HeapSnapshotVerifier.java | 5 ++-- .../svm/hosted/heap/SVMImageHeapVerifier.java | 28 +++++++++++++++++-- 5 files changed, 38 insertions(+), 7 deletions(-) diff --git a/substratevm/src/com.oracle.graal.pointsto.standalone/src/com/oracle/graal/pointsto/standalone/heap/StandaloneHeapSnapshotVerifier.java b/substratevm/src/com.oracle.graal.pointsto.standalone/src/com/oracle/graal/pointsto/standalone/heap/StandaloneHeapSnapshotVerifier.java index 5a747d086c5a..98926736963a 100644 --- a/substratevm/src/com.oracle.graal.pointsto.standalone/src/com/oracle/graal/pointsto/standalone/heap/StandaloneHeapSnapshotVerifier.java +++ b/substratevm/src/com.oracle.graal.pointsto.standalone/src/com/oracle/graal/pointsto/standalone/heap/StandaloneHeapSnapshotVerifier.java @@ -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; @@ -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()); diff --git a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/AbstractAnalysisEngine.java b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/AbstractAnalysisEngine.java index eae468a871e8..b03dbedd7f02 100644 --- a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/AbstractAnalysisEngine.java +++ b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/AbstractAnalysisEngine.java @@ -207,7 +207,7 @@ public void runAnalysis(DebugContext debugContext, Function 0; } - protected ObjectScanner installObjectScanner(CompletionExecutor executor) { + protected ObjectScanner installObjectScanner(@SuppressWarnings("unused") UniverseMetaAccess metaAccess, CompletionExecutor executor) { return new ObjectScanner(bb, executor, scannedObjects, new ScanningObserver()); } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/heap/SVMImageHeapVerifier.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/heap/SVMImageHeapVerifier.java index a38704f4caa4..a2409d35d082 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/heap/SVMImageHeapVerifier.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/heap/SVMImageHeapVerifier.java @@ -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; @@ -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(); } /** @@ -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(); }