diff --git a/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/substitutions/jvmci/Target_com_oracle_truffle_espresso_jvmci_EspressoJVMCIRuntime.java b/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/substitutions/jvmci/Target_com_oracle_truffle_espresso_jvmci_EspressoJVMCIRuntime.java index 521ef79e0455..5eae6b97404f 100644 --- a/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/substitutions/jvmci/Target_com_oracle_truffle_espresso_jvmci_EspressoJVMCIRuntime.java +++ b/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/substitutions/jvmci/Target_com_oracle_truffle_espresso_jvmci_EspressoJVMCIRuntime.java @@ -70,13 +70,16 @@ private Target_com_oracle_truffle_espresso_jvmci_EspressoJVMCIRuntime() { if (meta.jvmci.DummyEspressoGraalJVMCICompiler == null) { throw meta.throwNoClassDefFoundErrorBoundary("com.oracle.truffle.espresso.graal.DummyEspressoGraalJVMCICompiler is missing"); } - openJVMCITo(meta.jvmci.GraalJVMCICompiler.module(), meta); + /* + * JVMCI.initializeRuntime has already opened JVMCI to jdk.graal.compiler. Let's further + * open it to jdk.graal.compiler.espresso. + */ openJVMCITo(meta.jvmci.DummyEspressoGraalJVMCICompiler.module(), meta); LOGGER.fine("Creating DummyEspressoGraalJVMCICompiler"); return (StaticObject) meta.jvmci.DummyEspressoGraalJVMCICompiler_create.invokeDirectStatic(self); } - private static void openJVMCITo(ModuleTable.ModuleEntry compilerModuleEntry, Meta meta) { + static void openJVMCITo(ModuleTable.ModuleEntry compilerModuleEntry, Meta meta) { LOGGER.finer(() -> "Opening JVMCI to " + compilerModuleEntry.getNameAsString()); StaticObject compilerModule = compilerModuleEntry.module(); meta.jvmci.Services_openJVMCITo.invokeDirectStatic(compilerModule); diff --git a/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/substitutions/jvmci/Target_jdk_vm_ci_runtime_JVMCI.java b/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/substitutions/jvmci/Target_jdk_vm_ci_runtime_JVMCI.java index 6cadbbd3a1fa..599f7e09a72a 100644 --- a/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/substitutions/jvmci/Target_jdk_vm_ci_runtime_JVMCI.java +++ b/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/substitutions/jvmci/Target_jdk_vm_ci_runtime_JVMCI.java @@ -22,6 +22,8 @@ */ package com.oracle.truffle.espresso.substitutions.jvmci; +import static com.oracle.truffle.espresso.substitutions.jvmci.Target_com_oracle_truffle_espresso_jvmci_EspressoJVMCIRuntime.openJVMCITo; + import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.espresso.EspressoLanguage; import com.oracle.truffle.espresso.meta.Meta; @@ -42,6 +44,23 @@ private Target_jdk_vm_ci_runtime_JVMCI() { @Substitution public static @JavaType(internalName = "Ljdk/vm/ci/runtime/JVMCIRuntime;") StaticObject initializeRuntime(@Inject EspressoContext context) { checkJVMCIAvailable(context.getLanguage()); + Meta meta = context.getMeta(); + if (meta.jvmci.GraalJVMCICompiler != null) { + /* + * On HotSpot, HotSpotJVMCIRuntime.runtime uses JVMCIServiceLocator.getProviders which + * triggers Services.openJVMCITo for the module of HotSpotGraalJVMCIServiceLocator + * (jdk.graal.compiler). Achieve the same here by directly calling Services.openJVMCITo + * for the module of GraalJVMCICompiler (jdk.graal.compiler). + * + * Note that it is not enough to do this in + * EspressoJVMCIRuntime.createEspressoGraalJVMCICompiler since GraalServices could be + * used before the compiler is initialized. + * + * This is done only if GraalJVMCICompiler exists (i.e., jdk.graal.compiler is not an + * empty module). + */ + openJVMCITo(meta.jvmci.GraalJVMCICompiler.module(), meta); + } return (StaticObject) context.getMeta().jvmci.EspressoJVMCIRuntime_runtime.invokeDirectStatic(); }