-gpointer
-mono_create_class_init_trampoline (MonoVTable *vtable)
-{
- gpointer code, ptr;
- MonoDomain *domain = vtable->domain;
-
- g_assert (!vtable->klass->generic_container);
-
- /* previously created trampoline code */
- mono_domain_lock (domain);
- ptr =
- g_hash_table_lookup (domain_jit_info (domain)->class_init_trampoline_hash,
- vtable);
- mono_domain_unlock (domain);
- if (ptr)
- return ptr;
-
- code = mono_create_specific_trampoline (vtable, MONO_TRAMPOLINE_CLASS_INIT, domain, NULL);
-
- ptr = mono_create_ftnptr (domain, code);
-
- /* store trampoline address */
- mono_domain_lock (domain);
- g_hash_table_insert (domain_jit_info (domain)->class_init_trampoline_hash,
- vtable, ptr);
- mono_domain_unlock (domain);
-
- mono_trampolines_lock ();
- if (!class_init_hash_addr)
- class_init_hash_addr = g_hash_table_new (NULL, NULL);
- g_hash_table_insert (class_init_hash_addr, ptr, vtable);
- mono_trampolines_unlock ();
-
- return ptr;
-}
-
-gpointer
-mono_create_generic_class_init_trampoline (void)
-{
-#ifdef MONO_ARCH_VTABLE_REG
- static gpointer code;
- MonoTrampInfo *info;
-
- mono_trampolines_lock ();
-
- if (!code) {
- if (mono_aot_only)
- /* get_named_code () might return an ftnptr, but our caller expects a direct pointer */
- code = mono_get_addr_from_ftnptr (mono_aot_get_trampoline ("generic_class_init_trampoline"));
- else {
- code = mono_arch_create_generic_class_init_trampoline (&info, FALSE);
- mono_tramp_info_register (info);
- }
- }
-
- mono_trampolines_unlock ();
-
- return code;
-#else
- g_assert_not_reached ();
-#endif
-}
-