Skip to content

Commit 9b400a5

Browse files
committed
added hook for object reachability notifications
1 parent a4af309 commit 9b400a5

File tree

6 files changed

+26
-7
lines changed

6 files changed

+26
-7
lines changed

sdk/src/org.graalvm.nativeimage/snapshot.sigtest

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1017,6 +1017,7 @@ meth public abstract void registerClassInitializerReachabilityHandler(java.util.
10171017
meth public abstract void registerFieldValueTransformer(java.lang.reflect.Field,org.graalvm.nativeimage.hosted.FieldValueTransformer)
10181018
meth public abstract void registerMethodOverrideReachabilityHandler(java.util.function.BiConsumer<org.graalvm.nativeimage.hosted.Feature$DuringAnalysisAccess,java.lang.reflect.Executable>,java.lang.reflect.Executable)
10191019
meth public abstract void registerSubtypeReachabilityHandler(java.util.function.BiConsumer<org.graalvm.nativeimage.hosted.Feature$DuringAnalysisAccess,java.lang.Class<?>>,java.lang.Class<?>)
1020+
meth public abstract void registerObjectReachabilityHandler(java.util.function.Consumer<T>,java.lang.Class<T>)
10201021

10211022
CLSS public abstract interface static org.graalvm.nativeimage.hosted.Feature$BeforeCompilationAccess
10221023
outer org.graalvm.nativeimage.hosted.Feature

sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/Feature.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,14 @@ interface BeforeAnalysisAccess extends FeatureAccess {
312312
* @since 22.3
313313
*/
314314
void registerFieldValueTransformer(Field field, FieldValueTransformer transformer);
315+
316+
/**
317+
* Register a callback that is executed when an object of type {@code clazz}, or any of its
318+
* subtypes, is marked as reachable during heap scanning.
319+
*
320+
* @since 24.2
321+
*/
322+
<T> void registerObjectReachabilityHandler(Consumer<T> callback, Class<T> clazz);
315323
}
316324

317325
/**

substratevm/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
This changelog summarizes major changes to GraalVM Native Image.
44

55
## GraalVM for JDK 24 (Internal Version 24.2.0)
6+
* (GR-59717) Added `BeforeAnalysisAccess.registerObjectReachabilityHandler` to allow registering a callback that is executed when an object of a specified type is marked as reachable during heap scanning.
67
* (GR-55708) (Alibaba contribution) Support for running premain methods of Java agents at runtime as an experimental feature. At build time, `-H:PremainClasses` is used to set the premain classes.
78
At runtime, premain runtime options are set along with main class' arguments in the format of `-XXpremain:[class]:[options]`.
89
* (GR-54476): Issue a deprecation warning on first use of a legacy `graal.` prefix (see GR-49960 in [Compiler changelog](../compiler/CHANGELOG.md)).

substratevm/src/com.oracle.graal.pointsto.standalone/src/com/oracle/graal/pointsto/standalone/features/StandaloneAnalysisFeatureImpl.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,10 @@ public void registerClassInitializerReachabilityHandler(Consumer<Feature.DuringA
260260
@Override
261261
public void registerFieldValueTransformer(Field field, FieldValueTransformer transformer) {
262262
}
263+
264+
@Override
265+
public <T> void registerObjectReachabilityHandler(Consumer<T> callback, Class<T> clazz) {
266+
}
263267
}
264268

265269
public static class DuringAnalysisAccessImpl extends BeforeAnalysisAccessImpl implements Feature.DuringAnalysisAccess {

substratevm/src/com.oracle.svm.graal.hotspot.libgraal/src/com/oracle/svm/graal/hotspot/libgraal/LibGraalFeature.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,7 @@
5353
import org.graalvm.nativeimage.hosted.RuntimeReflection;
5454

5555
import com.oracle.graal.pointsto.BigBang;
56-
import com.oracle.graal.pointsto.ObjectScanner;
5756
import com.oracle.graal.pointsto.meta.AnalysisType;
58-
import com.oracle.graal.pointsto.meta.ObjectReachableCallback;
5957
import com.oracle.graal.pointsto.reports.CallTreePrinter;
6058
import com.oracle.svm.core.SubstrateTargetDescription;
6159
import com.oracle.svm.core.hub.ClassForNameSupport;
@@ -255,9 +253,6 @@ public void duringSetup(DuringSetupAccess access) {
255253

256254
DuringSetupAccessImpl accessImpl = (DuringSetupAccessImpl) access;
257255
accessImpl.registerClassReachabilityListener(this::registerPhaseStatistics);
258-
optionCollector = new OptionCollector(LibGraalEntryPoints.vmOptionDescriptors);
259-
accessImpl.registerObjectReachableCallback(OptionKey.class, optionCollector::doCallback);
260-
accessImpl.registerObjectReachableCallback(loadClassOrFail(OptionKey.class.getName()), optionCollector::doCallback);
261256
GetJNIConfig.register(loader);
262257
}
263258

@@ -270,7 +265,7 @@ public void duringSetup(DuringSetupAccess access) {
270265
* compiler options are instances of {@link OptionKey} loaded by the
271266
* {@code HostedLibGraalClassLoader}.
272267
*/
273-
private class OptionCollector implements ObjectReachableCallback<Object> {
268+
private class OptionCollector implements Consumer<Object> {
274269
private final Set<Object> options = Collections.newSetFromMap(new ConcurrentHashMap<>());
275270

276271
/**
@@ -297,7 +292,7 @@ private class OptionCollector implements ObjectReachableCallback<Object> {
297292
}
298293

299294
@Override
300-
public void doCallback(DuringAnalysisAccess access, Object option, ObjectScanner.ScanReason reason) {
295+
public void accept(Object option) {
301296
if (sealed) {
302297
VMError.guarantee(options.contains(option), "All options must have been discovered during static analysis: %s", option);
303298
} else {
@@ -371,6 +366,10 @@ private void registerPhaseStatistics(DuringAnalysisAccess a, Class<?> newlyReach
371366

372367
@Override
373368
public void beforeAnalysis(BeforeAnalysisAccess baa) {
369+
optionCollector = new OptionCollector(LibGraalEntryPoints.vmOptionDescriptors);
370+
baa.registerObjectReachabilityHandler(optionCollector::accept, OptionKey.class);
371+
baa.registerObjectReachabilityHandler(optionCollector::accept, loadClassOrFail(OptionKey.class.getName()));
372+
374373
BeforeAnalysisAccessImpl impl = (BeforeAnalysisAccessImpl) baa;
375374
var bb = impl.getBigBang();
376375

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/FeatureImpl.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,12 @@ public void registerOpaqueMethodReturn(Method method) {
499499
VMError.guarantee(aMethod.getAllMultiMethods().size() == 1, "Opaque method return called for method with >1 multimethods: %s ", method);
500500
aMethod.setOpaqueReturn();
501501
}
502+
503+
@Override
504+
public <T> void registerObjectReachabilityHandler(Consumer<T> callback, Class<T> clazz) {
505+
ObjectReachableCallback<T> wrapper = (access, obj, reason) -> callback.accept(obj);
506+
getMetaAccess().lookupJavaType(clazz).registerObjectReachableCallback(wrapper);
507+
}
502508
}
503509

504510
public static class DuringAnalysisAccessImpl extends BeforeAnalysisAccessImpl implements Feature.DuringAnalysisAccess {

0 commit comments

Comments
 (0)