+static gboolean
+init_method (MonoAotModule *amodule, guint32 method_index, MonoMethod *method, MonoClass **klass)
+{
+ MonoDomain *domain = mono_domain_get ();
+ MonoMemPool *mp;
+ int pindex, n_patches;
+ guint8 *p;
+ MonoJitInfo *jinfo = NULL;
+ guint8 *code, *info;
+
+ code = amodule->methods [method_index];
+ info = &amodule->blob [mono_aot_get_offset (amodule->method_info_offsets, method_index)];
+
+ p = info;
+
+ if (method) {
+ *klass = method->klass;
+ decode_klass_ref (amodule, p, &p);
+ } else {
+ *klass = decode_klass_ref (amodule, p, &p);
+ }
+
+ n_patches = decode_value (p, &p);
+
+ if (n_patches) {
+ MonoJumpInfo *patches;
+ guint32 *got_slots;
+ gboolean llvm;
+ gpointer *got;
+
+ mp = mono_mempool_new ();
+
+ if ((gpointer)code >= amodule->info.jit_code_start && (gpointer)code <= amodule->info.jit_code_end) {
+ llvm = FALSE;
+ got = amodule->got;
+ } else {
+ llvm = TRUE;
+ got = amodule->llvm_got;
+ g_assert (got);
+ }
+
+ patches = load_patch_info (amodule, mp, n_patches, llvm, &got_slots, p, &p);
+ if (patches == NULL)
+ goto cleanup;
+
+ for (pindex = 0; pindex < n_patches; ++pindex) {
+ MonoJumpInfo *ji = &patches [pindex];
+ gpointer addr;
+
+ /*
+ * For SFLDA, we need to call resolve_patch_target () since the GOT slot could have
+ * been initialized by load_method () for a static cctor before the cctor has
+ * finished executing (#23242).
+ */
+ if (!got [got_slots [pindex]] || ji->type == MONO_PATCH_INFO_SFLDA) {
+ addr = mono_resolve_patch_target (method, domain, code, ji, TRUE);
+ if (ji->type == MONO_PATCH_INFO_METHOD_JUMP)
+ addr = mono_create_ftnptr (domain, addr);
+ mono_memory_barrier ();
+ got [got_slots [pindex]] = addr;
+ if (ji->type == MONO_PATCH_INFO_METHOD_JUMP)
+ register_jump_target_got_slot (domain, ji->data.method, &(got [got_slots [pindex]]));
+ }
+ ji->type = MONO_PATCH_INFO_NONE;
+ }
+
+ g_free (got_slots);
+
+ mono_mempool_destroy (mp);
+ }
+
+ if (mini_get_debug_options ()->load_aot_jit_info_eagerly)
+ jinfo = mono_aot_find_jit_info (domain, amodule->assembly->image, code);
+
+ return TRUE;
+
+ cleanup:
+ if (jinfo)
+ g_free (jinfo);
+
+ return FALSE;
+}
+