+2004-11-05 Zoltan Varga <vargaz@freemail.hu>
+
+ * mini.h mini.c tramp-*.c: Moved xp parts of JIT trampoline creation
+ into a new function mono_create_jit_trampoline ().
+
2004-11-02 Zoltan Varga <vargaz@freemail.hu>
* trace.c (get_spec): Allow tracing of classes without a namespace.
return ji->code_start;
}
+gpointer
+mono_create_jit_trampoline (MonoMethod *method)
+{
+ MonoJitInfo *ji;
+ MonoDomain *domain = mono_domain_get ();
+ gpointer tramp;
+
+ /* Trampoline are domain specific, so cache only the one used in the root domain */
+ if ((domain == mono_get_root_domain ()) && method->info)
+ return method->info;
+
+ if (method->iflags & METHOD_IMPL_ATTRIBUTE_SYNCHRONIZED)
+ return mono_create_jit_trampoline (mono_marshal_get_synchronized_wrapper (method));
+
+ tramp = mono_arch_create_jit_trampoline (method);
+ if (domain == mono_get_root_domain ())
+ method->info = tramp;
+
+ return tramp;
+}
+
MonoVTable*
mono_find_class_init_trampoline_by_addr (gconstpointer addr)
{
target = code;
} else
/* get the trampoline to the method from the domain */
- target = mono_arch_create_jit_trampoline (patch_info->data.method);
+ target = mono_create_jit_trampoline (patch_info->data.method);
break;
case MONO_PATCH_INFO_SWITCH: {
gpointer *jump_table;
#ifdef JIT_TRAMPOLINES_WORK
mono_install_compile_method (mono_jit_compile_method);
mono_install_free_method (mono_jit_free_method);
- mono_install_trampoline (mono_arch_create_jit_trampoline);
+ mono_install_trampoline (mono_create_jit_trampoline);
mono_install_remoting_trampoline (mono_jit_create_remoting_trampoline);
#endif
#define JIT_INVOKE_WORKS
MonoMethod *method,
gboolean add_sync_wrapper);
gpointer mono_create_class_init_trampoline (MonoVTable *vtable);
+gpointer mono_create_jit_trampoline (MonoMethod *method);
MonoVTable* mono_find_class_init_trampoline_by_addr (gconstpointer addr);
gboolean mono_running_on_valgrind (void);
mono_arch_create_jit_trampoline (MonoMethod *method)
{
MonoJitInfo *ji;
- MonoDomain *domain = mono_domain_get ();
-
- /* Trampoline are domain specific, so cache only the one used in the root domain */
- if ((domain == mono_get_root_domain ()) && method->info)
- return method->info;
-
- if (method->iflags & METHOD_IMPL_ATTRIBUTE_SYNCHRONIZED)
- return mono_arch_create_jit_trampoline (mono_marshal_get_synchronized_wrapper (method));
+ gpointer code_start;
ji = create_specific_trampoline (method, MONO_TRAMPOLINE_GENERIC, domain);
- if (domain == mono_get_root_domain ())
- method->info = ji->code_start;
+ code_start = ji->code_start;
g_free (ji);
- return ji->code_start;
+ return code_start;
}
/**
guint8 *tramp;
MonoJitInfo *ji;
MonoDomain* domain = mono_domain_get ();
-
- /* previously created trampoline code */
- if (method->info)
- return method->info;
-
- if (method->iflags & METHOD_IMPL_ATTRIBUTE_SYNCHRONIZED)
- return mono_arch_create_jit_trampoline (mono_marshal_get_synchronized_wrapper (method));
+ gpointer code_start;
tramp = create_trampoline_code (MONO_TRAMPOLINE_GENERIC);
- /* FIXME: should pass the domain down tot his function */
+ /* FIXME: should pass the domain down to this function */
ji = create_specific_tramp (method, tramp, domain);
- /* Store trampoline address */
- method->info = ji->code_start;
- return ji->code_start;
+ code_start = ji->code_start;
+ g_free (ji);
+
+ return code_start;
}
/**
static guint8 *vc = NULL;
gint32 displace;
- /* previously created trampoline code */
- if (method->info)
- return method->info;
-
- if (method->iflags & METHOD_IMPL_ATTRIBUTE_SYNCHRONIZED)
- return mono_arch_create_jit_trampoline (mono_marshal_get_synchronized_wrapper (method));
-
vc = create_trampoline_code (MONO_TRAMPOLINE_GENERIC);
/* This is the method-specific part of the trampoline. Its purpose is
/* Sanity check */
g_assert ((buf - code) <= METHOD_TRAMPOLINE_SIZE);
- /* Store trampoline address */
- method->info = code;
-
mono_jit_stats.method_trampolines++;
return code;
static guint8 *vc = NULL;
gint32 displace;
- /* previously created trampoline code */
- if (method->info)
- return method->info;
-
- if (method->iflags & METHOD_IMPL_ATTRIBUTE_SYNCHRONIZED)
- return mono_arch_create_jit_trampoline (mono_marshal_get_synchronized_wrapper (method));
-
vc = create_trampoline_code (MONO_TRAMPOLINE_GENERIC);
/* This is the method-specific part of the trampoline. Its purpose is
/* Sanity check */
g_assert ((buf - code) <= METHOD_TRAMPOLINE_SIZE);
- /* Store trampoline address */
- method->info = code;
-
mono_jit_stats.method_trampolines++;
return code;
mono_arch_create_jit_trampoline (MonoMethod *method)
{
MonoJitInfo *ji;
+ gpointer code_start;
- /* previously created trampoline code */
- if (method->info)
- return method->info;
-
- if (method->iflags & METHOD_IMPL_ATTRIBUTE_SYNCHRONIZED)
- return mono_arch_create_jit_trampoline (mono_marshal_get_synchronized_wrapper (method));
-
- ji = create_specific_trampoline (method, MONO_TRAMPOLINE_GENERIC, mono_domain_get ());
- method->info = ji->code_start;
+ ji = create_specific_trampoline (method, MONO_TRAMPOLINE_GENERIC, domain);
+ code_start = ji->code_start;
g_free (ji);
- return method->info;
+ return code_start;
}
/**