Skip to content

Commit 9552445

Browse files
committed
Backward compatibility with GraalVM 21.
1 parent eaaccdf commit 9552445

File tree

4 files changed

+157
-8
lines changed

4 files changed

+157
-8
lines changed

compiler/src/jdk.graal.compiler.libgraal/src/jdk/graal/compiler/libgraal/truffle/LibGraalTruffleEntryPoints.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,18 @@ public static void initializeIsolate(JNIEnv env, JClass hsClazz, @IsolateThreadC
105105
@SuppressWarnings({"unused", "try"})
106106
@CEntryPoint(name = "Java_com_oracle_truffle_runtime_hotspot_libgraal_TruffleToLibGraalCalls_registerRuntime", include = LibGraalFeature.IsEnabled.class)
107107
@TruffleToLibGraal(Id.RegisterRuntime)
108+
public static boolean registerRuntime(JNIEnv env, JClass hsClazz, @IsolateThreadContext long isolateThreadAddress, JObject truffleRuntime) {
109+
try (JNIMethodScope s = openScope(Id.RegisterRuntime, env)) {
110+
throw new UnsupportedOperationException("Operation not supported on Graal compiler 25.1 and later");
111+
} catch (Throwable t) {
112+
JNIExceptionWrapper.throwInHotSpot(env, t);
113+
return false;
114+
}
115+
}
116+
117+
@SuppressWarnings({"unused", "try"})
118+
@CEntryPoint(name = "Java_com_oracle_truffle_runtime_hotspot_libgraal_TruffleToLibGraalCalls3_registerRuntime", include = LibGraalFeature.IsEnabled.class)
119+
@TruffleToLibGraal(Id.RegisterRuntime)
108120
public static boolean registerRuntime(JNIEnv env, JClass hsClazz, @IsolateThreadContext long isolateThreadAddress, JObject truffleRuntime,
109121
JObject javaInstrumentationActive) {
110122
try (JNIMethodScope s = openScope(Id.RegisterRuntime, env)) {
@@ -120,6 +132,19 @@ public static boolean registerRuntime(JNIEnv env, JClass hsClazz, @IsolateThread
120132
@SuppressWarnings({"unused", "try"})
121133
@CEntryPoint(name = "Java_com_oracle_truffle_runtime_hotspot_libgraal_TruffleToLibGraalCalls_initializeRuntime", include = LibGraalFeature.IsEnabled.class)
122134
@TruffleToLibGraal(Id.InitializeRuntime)
135+
public static long initializeRuntime(JNIEnv env, JClass hsClazz, @IsolateThreadContext long isolateThreadAddress,
136+
JObject truffleRuntime, JClass hsClassLoaderDelegate) {
137+
try (JNIMethodScope s = openScope(Id.InitializeRuntime, env)) {
138+
throw new UnsupportedOperationException("Operation not supported on Graal compiler 25.1 and later");
139+
} catch (Throwable t) {
140+
JNIExceptionWrapper.throwInHotSpot(env, t);
141+
return 0L;
142+
}
143+
}
144+
145+
@SuppressWarnings({"unused", "try"})
146+
@CEntryPoint(name = "Java_com_oracle_truffle_runtime_hotspot_libgraal_TruffleToLibGraalCalls3_initializeRuntime", include = LibGraalFeature.IsEnabled.class)
147+
@TruffleToLibGraal(Id.InitializeRuntime)
123148
public static long initializeRuntime(JNIEnv env, JClass hsClazz, @IsolateThreadContext long isolateThreadAddress,
124149
JObject truffleRuntime, JClass hsClassLoaderDelegate, JObject javaInstrumentationActive) {
125150
try (JNIMethodScope s = openScope(Id.InitializeRuntime, env)) {

truffle/src/com.oracle.truffle.runtime/src/com/oracle/truffle/runtime/hotspot/libgraal/LibGraalTruffleCompilationSupport.java

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ public static void initializeIsolate(long isolateThreadId) {
7676
} catch (UnsatisfiedLinkError e) {
7777
// deliberately ignored, the entry points might not be there
7878
}
79+
TruffleToLibGraalCalls3.initialize();
7980
TruffleToLibGraalCalls.initializeIsolate(isolateThreadId, LibGraalTruffleCompilationSupport.class);
8081
}
8182

@@ -108,12 +109,29 @@ public TruffleCompiler createCompiler(TruffleCompilerRuntime runtime) {
108109
public void registerRuntime(TruffleCompilerRuntime runtime) {
109110
try (LibGraalScope scope = new LibGraalScope(DetachAction.DETACH_RUNTIME_AND_RELEASE)) {
110111
runtime().registerNativeMethods(TruffleToLibGraalCalls.class);
111-
if (!TruffleToLibGraalCalls.registerRuntime(getIsolateThread(), runtime, JFRListener.nativeState())) {
112+
if (!registerRuntimeImpl(runtime)) {
112113
throw new IllegalStateException("Truffle with libgraal cannot be loaded in multiple class loaders. Make sure Truffle is loaded with the system class loader.");
113114
}
114115
}
115116
}
116117

118+
private static boolean registerRuntimeImpl(TruffleCompilerRuntime runtime) {
119+
if (TruffleToLibGraalCalls3.REGISTER_RUNTIME_HANDLE != null) {
120+
try {
121+
return (boolean) TruffleToLibGraalCalls3.REGISTER_RUNTIME_HANDLE.invoke(getIsolateThread(), runtime, JFRListener.nativeState());
122+
} catch (Throwable t) {
123+
throw sthrow(RuntimeException.class, t);
124+
}
125+
} else {
126+
return TruffleToLibGraalCalls.registerRuntime(getIsolateThread(), runtime);
127+
}
128+
}
129+
130+
@SuppressWarnings({"unchecked", "unused"})
131+
private static <T extends Throwable> T sthrow(Class<T> type, Throwable t) throws T {
132+
throw (T) t;
133+
}
134+
117135
@SuppressWarnings("try")
118136
@Override
119137
public TruffleCompilerOptionDescriptor[] listCompilerOptions() {
@@ -173,9 +191,19 @@ public boolean isSuppressedCompilationFailure(Throwable throwable) {
173191
@SuppressWarnings("try")
174192
static long handle(TruffleCompilerRuntime runtime) {
175193
try (LibGraalScope scope = new LibGraalScope()) {
176-
return scope.getIsolate().getSingleton(Handle.class, () -> {
177-
return new Handle(TruffleToLibGraalCalls.initializeRuntime(getIsolateThread(), runtime, runtime.getClass(), JFRListener.nativeState()));
178-
}).getHandle();
194+
return scope.getIsolate().getSingleton(Handle.class, () -> new Handle(initializeRuntimeImpl(runtime))).getHandle();
195+
}
196+
}
197+
198+
private static long initializeRuntimeImpl(TruffleCompilerRuntime runtime) {
199+
if (TruffleToLibGraalCalls3.INITIALIZE_RUNTIME_HANDLE != null) {
200+
try {
201+
return (long) TruffleToLibGraalCalls3.INITIALIZE_RUNTIME_HANDLE.invoke(getIsolateThread(), runtime, runtime.getClass(), JFRListener.nativeState());
202+
} catch (Throwable t) {
203+
throw sthrow(RuntimeException.class, t);
204+
}
205+
} else {
206+
return TruffleToLibGraalCalls.initializeRuntime(getIsolateThread(), runtime, runtime.getClass());
179207
}
180208
}
181209

truffle/src/com.oracle.truffle.runtime/src/com/oracle/truffle/runtime/hotspot/libgraal/TruffleToLibGraalCalls.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,6 @@
7070
import com.oracle.truffle.compiler.hotspot.libgraal.TruffleToLibGraal;
7171
import com.oracle.truffle.compiler.hotspot.libgraal.TruffleToLibGraal.Id;
7272

73-
import java.nio.ByteBuffer;
74-
7573
/**
7674
* Native methods linked to libgraal entry points.
7775
*/
@@ -89,10 +87,10 @@ final class TruffleToLibGraalCalls {
8987
* {@link #registerRuntime(long, Object)}.
9088
*/
9189
@TruffleToLibGraal(RegisterRuntime)
92-
static native boolean registerRuntime(long isolateThreadAddress, Object truffleRuntime, ByteBuffer javaInstrumentationActive);
90+
static native boolean registerRuntime(long isolateThreadAddress, Object truffleRuntime);
9391

9492
@TruffleToLibGraal(InitializeRuntime)
95-
static native long initializeRuntime(long isolateThreadAddress, TruffleCompilerRuntime truffleRuntime, Class<?> classLoaderDelegate, ByteBuffer javaInstrumentationActive);
93+
static native long initializeRuntime(long isolateThreadAddress, TruffleCompilerRuntime truffleRuntime, Class<?> classLoaderDelegate);
9694

9795
@TruffleToLibGraal(Id.ListCompilerOptions)
9896
static native byte[] listCompilerOptions(long isolateThreadAddress);
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
/*
2+
* Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* The Universal Permissive License (UPL), Version 1.0
6+
*
7+
* Subject to the condition set forth below, permission is hereby granted to any
8+
* person obtaining a copy of this software, associated documentation and/or
9+
* data (collectively the "Software"), free of charge and under any and all
10+
* copyright rights in the Software, and any and all patent rights owned or
11+
* freely licensable by each licensor hereunder covering either (i) the
12+
* unmodified Software as contributed to or provided by such licensor, or (ii)
13+
* the Larger Works (as defined below), to deal in both
14+
*
15+
* (a) the Software, and
16+
*
17+
* (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
18+
* one is included with the Software each a "Larger Work" to which the Software
19+
* is contributed by such licensors),
20+
*
21+
* without restriction, including without limitation the rights to copy, create
22+
* derivative works of, display, perform, and distribute the Software and make,
23+
* use, sell, offer for sale, import, export, have made, and have sold the
24+
* Software and the Larger Work(s), and to sublicense the foregoing rights on
25+
* either these or other terms.
26+
*
27+
* This license is subject to the following condition:
28+
*
29+
* The above copyright notice and either this complete permission notice or at a
30+
* minimum a reference to the UPL must be included in all copies or substantial
31+
* portions of the Software.
32+
*
33+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
34+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
35+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
36+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
37+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
38+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
39+
* SOFTWARE.
40+
*/
41+
package com.oracle.truffle.runtime.hotspot.libgraal;
42+
43+
import com.oracle.truffle.compiler.TruffleCompilerRuntime;
44+
import com.oracle.truffle.compiler.hotspot.libgraal.TruffleToLibGraal;
45+
46+
import java.lang.invoke.MethodHandle;
47+
import java.lang.invoke.MethodHandles;
48+
import java.lang.invoke.MethodType;
49+
import java.nio.ByteBuffer;
50+
51+
import static com.oracle.truffle.compiler.hotspot.libgraal.TruffleToLibGraal.Id.InitializeRuntime;
52+
import static com.oracle.truffle.compiler.hotspot.libgraal.TruffleToLibGraal.Id.RegisterRuntime;
53+
import static jdk.vm.ci.hotspot.HotSpotJVMCIRuntime.runtime;
54+
55+
/**
56+
* The method defined in this class can't be added to {@link TruffleToLibGraalCalls}, because the
57+
* code has to work also with libgraal which does not have the entry point for the method.
58+
* Therefore, {@link jdk.vm.ci.hotspot.HotSpotJVMCIRuntime#registerNativeMethods(Class) registering}
59+
* this class might throw an {@link UnsatisfiedLinkError error}.
60+
*/
61+
final class TruffleToLibGraalCalls3 {
62+
63+
static final MethodHandle INITIALIZE_RUNTIME_HANDLE;
64+
static final MethodHandle REGISTER_RUNTIME_HANDLE;
65+
66+
static {
67+
boolean linked = false;
68+
try {
69+
runtime().registerNativeMethods(TruffleToLibGraalCalls3.class);
70+
linked = true;
71+
} catch (UnsatisfiedLinkError e) {
72+
// The libgraal entry points are not available, pre 25.1 graal compiler.
73+
}
74+
if (linked) {
75+
try {
76+
MethodType type = MethodType.methodType(long.class, long.class, TruffleCompilerRuntime.class, Class.class, ByteBuffer.class);
77+
INITIALIZE_RUNTIME_HANDLE = MethodHandles.lookup().findStatic(TruffleToLibGraalCalls3.class, "initializeRuntime", type);
78+
type = MethodType.methodType(boolean.class, long.class, TruffleCompilerRuntime.class, ByteBuffer.class);
79+
REGISTER_RUNTIME_HANDLE = MethodHandles.lookup().findStatic(TruffleToLibGraalCalls3.class, "registerRuntime", type);
80+
} catch (NoSuchMethodException | IllegalAccessException e) {
81+
throw new InternalError(e);
82+
}
83+
} else {
84+
INITIALIZE_RUNTIME_HANDLE = null;
85+
REGISTER_RUNTIME_HANDLE = null;
86+
}
87+
}
88+
89+
static void initialize() {
90+
// Runs static initializer to initialize method handles
91+
}
92+
93+
@TruffleToLibGraal(InitializeRuntime)
94+
static native long initializeRuntime(long isolateThreadAddress, TruffleCompilerRuntime truffleRuntime, Class<?> classLoaderDelegate, ByteBuffer javaInstrumentationActive);
95+
96+
@TruffleToLibGraal(RegisterRuntime)
97+
static native boolean registerRuntime(long isolateThreadAddress, TruffleCompilerRuntime truffleRuntime, ByteBuffer javaInstrumentationActive);
98+
}

0 commit comments

Comments
 (0)