@@ -163,9 +163,10 @@ public final class CEntryPointSnippets extends SubstrateTemplates implements Sni
163163 public static final SubstrateForeignCallDescriptor FAIL_FATALLY = SnippetRuntime .findForeignCall (CEntryPointSnippets .class , "failFatally" , HAS_SIDE_EFFECT , LocationIdentity .any ());
164164 public static final SubstrateForeignCallDescriptor VERIFY_ISOLATE_THREAD = SnippetRuntime .findForeignCall (CEntryPointSnippets .class , "verifyIsolateThread" , HAS_SIDE_EFFECT ,
165165 LocationIdentity .any ());
166+ public static final SubstrateForeignCallDescriptor INIT_CODE_BASE = SnippetRuntime .findForeignCall (CEntryPointSnippets .class , "initCodeBase" , HAS_SIDE_EFFECT , LocationIdentity .any ());
166167
167168 public static final SubstrateForeignCallDescriptor [] FOREIGN_CALLS = {CREATE_ISOLATE , INITIALIZE_ISOLATE , ATTACH_THREAD , ENSURE_JAVA_THREAD , ENTER_BY_ISOLATE ,
168- DETACH_CURRENT_THREAD , REPORT_EXCEPTION , TEAR_DOWN_ISOLATE , IS_ATTACHED , FAIL_FATALLY , VERIFY_ISOLATE_THREAD };
169+ DETACH_CURRENT_THREAD , REPORT_EXCEPTION , TEAR_DOWN_ISOLATE , IS_ATTACHED , FAIL_FATALLY , VERIFY_ISOLATE_THREAD , INIT_CODE_BASE };
169170
170171 @ NodeIntrinsic (value = ForeignCallNode .class )
171172 public static native int runtimeCall (@ ConstantNodeParameter ForeignCallDescriptor descriptor , CEntryPointCreateIsolateParameters parameters );
@@ -185,9 +186,6 @@ public final class CEntryPointSnippets extends SubstrateTemplates implements Sni
185186 @ NodeIntrinsic (value = ForeignCallNode .class )
186187 public static native int runtimeCallInitializeIsolate (@ ConstantNodeParameter ForeignCallDescriptor descriptor , CEntryPointCreateIsolateParameters parameters );
187188
188- @ NodeIntrinsic (value = ForeignCallNode .class )
189- public static native int runtimeCallTearDownIsolate (@ ConstantNodeParameter ForeignCallDescriptor descriptor );
190-
191189 @ NodeIntrinsic (value = ForeignCallNode .class )
192190 public static native boolean runtimeCallIsAttached (@ ConstantNodeParameter ForeignCallDescriptor descriptor , Isolate isolate );
193191
@@ -197,6 +195,9 @@ public final class CEntryPointSnippets extends SubstrateTemplates implements Sni
197195 @ NodeIntrinsic (value = ForeignCallNode .class )
198196 public static native void runtimeCallFailFatally (@ ConstantNodeParameter ForeignCallDescriptor descriptor , int code , CCharPointer message );
199197
198+ @ NodeIntrinsic (value = ForeignCallNode .class )
199+ public static native void runtimeCallInitCodeBase (@ ConstantNodeParameter ForeignCallDescriptor descriptor );
200+
200201 @ Fold
201202 static boolean hasHeapBase () {
202203 return ImageSingletons .lookup (CompressEncoding .class ).hasBase ();
@@ -210,8 +211,13 @@ private static void setHeapBase(PointerBase heapBase) {
210211 }
211212 }
212213
213- @ Uninterruptible (reason = CALLED_FROM_UNINTERRUPTIBLE_CODE )
214- @ NeverInline ("Heap base register is set in caller, prevent reads from floating before that." )
214+ /**
215+ * Initializes the code base register, which accesses the heap using the heap base register. To
216+ * prevent the compiler from moving reads from this method to before the heap base register is
217+ * initialized in a caller, this method is a foreign call target that does not get inlined.
218+ */
219+ @ SubstrateForeignCallTarget (stubCallingConvention = false )
220+ @ Uninterruptible (reason = "Thread state not yet set up." )
215221 private static void initCodeBase () {
216222 CodePointer codeBase ;
217223 if (ImageLayerBuildingSupport .buildingImageLayer ()) {
@@ -243,7 +249,7 @@ public static void earlyInitHeapBase(PointerBase heapBase) {
243249 public static void initBaseRegisters (PointerBase heapBase ) {
244250 setHeapBase (heapBase );
245251 if (SubstrateOptions .useRelativeCodePointers ()) {
246- initCodeBase ( );
252+ runtimeCallInitCodeBase ( INIT_CODE_BASE );
247253 }
248254 }
249255
@@ -683,7 +689,7 @@ private static int detachCurrentThread() {
683689
684690 @ Snippet (allowMissingProbabilities = true )
685691 public static int tearDownIsolateSnippet () {
686- return runtimeCallTearDownIsolate (TEAR_DOWN_ISOLATE );
692+ return runtimeCall (TEAR_DOWN_ISOLATE );
687693 }
688694
689695 @ SubstrateForeignCallTarget (stubCallingConvention = false )
0 commit comments