Skip to content

Commit d17687e

Browse files
committed
Add API to control which bootstrap methods are allowed to be executed at build time
1 parent 8de9cc1 commit d17687e

File tree

6 files changed

+257
-155
lines changed

6 files changed

+257
-155
lines changed

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/bootstrap/BootstrapMethodConfiguration.java

Lines changed: 0 additions & 147 deletions
This file was deleted.
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/*
2+
* Copyright (c) 2025, 2025, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* This code is free software; you can redistribute it and/or modify it
6+
* under the terms of the GNU General Public License version 2 only, as
7+
* published by the Free Software Foundation. Oracle designates this
8+
* particular file as subject to the "Classpath" exception as provided
9+
* by Oracle in the LICENSE file that accompanied this code.
10+
*
11+
* This code is distributed in the hope that it will be useful, but WITHOUT
12+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14+
* version 2 for more details (a copy is included in the LICENSE file that
15+
* accompanied this code).
16+
*
17+
* You should have received a copy of the GNU General Public License version
18+
* 2 along with this work; if not, write to the Free Software Foundation,
19+
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20+
*
21+
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22+
* or visit www.oracle.com if you need additional information or have any
23+
* questions.
24+
*/
25+
package com.oracle.svm.core.bootstrap;
26+
27+
import java.util.concurrent.ConcurrentHashMap;
28+
import java.util.concurrent.ConcurrentMap;
29+
30+
import org.graalvm.nativeimage.ImageSingletons;
31+
32+
import com.oracle.svm.core.feature.AutomaticallyRegisteredImageSingleton;
33+
import com.oracle.svm.core.traits.BuiltinTraits;
34+
import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly;
35+
import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.Independent;
36+
import com.oracle.svm.core.traits.SingletonTraits;
37+
38+
import jdk.vm.ci.meta.ResolvedJavaMethod;
39+
40+
/**
41+
* This image singleton is used to cache the {@link BootstrapMethodInfo} computed at run time to
42+
* make sure they are only computed once.
43+
*/
44+
@SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = BuiltinTraits.NoLayeredCallbacks.class, layeredInstallationKind = Independent.class)
45+
@AutomaticallyRegisteredImageSingleton
46+
public class BootstrapMethodInfoCache {
47+
48+
/**
49+
* Map used to cache the {@link BootstrapMethodInfo} and reuse it for duplicated bytecode,
50+
* avoiding execution of the bootstrap method for the same bci and method pair. This can happen
51+
* during bytecode parsing as some blocks are duplicated, or for methods that are parsed
52+
* multiple times (see MultiMethod).
53+
*/
54+
private final ConcurrentMap<BootstrapMethodRecord, BootstrapMethodInfo> bootstrapMethodInfoCache = new ConcurrentHashMap<>();
55+
56+
/**
57+
* The key of the cache.
58+
*/
59+
public record BootstrapMethodRecord(int bci, int cpi, ResolvedJavaMethod method) {
60+
}
61+
62+
public static BootstrapMethodInfoCache singleton() {
63+
return ImageSingletons.lookup(BootstrapMethodInfoCache.class);
64+
}
65+
66+
public ConcurrentMap<BootstrapMethodRecord, BootstrapMethodInfo> getBootstrapMethodInfoCache() {
67+
return bootstrapMethodInfoCache;
68+
}
69+
}

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@
8787
import com.oracle.svm.core.util.VMError;
8888
import com.oracle.svm.hosted.ameta.FieldValueInterceptionSupport;
8989
import com.oracle.svm.hosted.analysis.Inflation;
90+
import com.oracle.svm.hosted.bootstrap.BootstrapMethodConfiguration;
9091
import com.oracle.svm.hosted.c.NativeLibraries;
9192
import com.oracle.svm.hosted.code.CEntryPointData;
9293
import com.oracle.svm.hosted.code.CompileQueue.CompileTask;
@@ -401,6 +402,30 @@ public void registerClassReachabilityListener(BiConsumer<DuringAnalysisAccess, C
401402
getHostVM().registerClassReachabilityListener(listener);
402403
}
403404

405+
/**
406+
* Registers a method that is allowed to be executed at build time if called as the
407+
* bootstrap method for an invokedynamic, in which case each call site outputted will be
408+
* constant-folded. Other bootstrap methods will be executed at run time by default,
409+
* creating the call site at run time.
410+
*
411+
* @since 25.1
412+
*/
413+
public void registerBuildTimeIndyIncludeList(Executable method) {
414+
BootstrapMethodConfiguration.singleton().addBuildTimeIndy(getUniverse().getOriginalMetaAccess().lookupJavaMethod(method));
415+
}
416+
417+
/**
418+
* Registers a method that is allowed to be executed at build time if called as the
419+
* bootstrap method for a constantdynamic, in which case each call site outputted will be
420+
* constant-folded. Other bootstrap methods will be executed at run time by default,
421+
* creating the call site at run time.
422+
*
423+
* @since 25.1
424+
*/
425+
public void registerBuildTimeCondyIncludeList(Executable method) {
426+
BootstrapMethodConfiguration.singleton().addBuildTimeCondy(getUniverse().getOriginalMetaAccess().lookupJavaMethod(method));
427+
}
428+
404429
public SVMHost getHostVM() {
405430
return bb.getHostVM();
406431
}

0 commit comments

Comments
 (0)