guint8 *code, *start;
int this_pos = 4, reg;
- if (!m->signature->ret->byref && MONO_TYPE_ISSTRUCT (m->signature->ret))
+ if (!mono_method_signature (m)->ret->byref && MONO_TYPE_ISSTRUCT (mono_method_signature (m)->ret))
this_pos = 8;
- start = code = g_malloc (36);
+ start = code = mono_global_codeman_reserve (36);
/* This executes in the context of the caller, hence o0 */
sparc_add_imm (code, 0, sparc_o0, sizeof (MonoObject), sparc_o0);
* needed.
*/
if (mono_sparc_is_virtual_call (code)) {
- if (m->klass->valuetype)
- addr = get_unbox_trampoline (m, addr);
-
/* Compute address of vtable slot */
vtable_slot = mono_sparc_get_vcall_slot_addr (code, fp);
- *vtable_slot = addr;
+ if (m->klass->valuetype && !mono_aot_is_got_entry (code, vtable_slot))
+ addr = get_unbox_trampoline (m, addr);
+ if (mono_aot_is_got_entry (code, vtable_slot) || mono_domain_owns_vtable_slot (mono_domain_get (), vtable_slot))
+ *vtable_slot = addr;
}
else {
/* Patch calling code */
MonoJitInfo *target_ji =
mono_jit_info_table_find (mono_domain_get (), addr);
- /* The first part of the condition means an icall without a wrapper */
- if ((!target_ji && m->addr) || mono_method_same_domain (ji, target_ji)) {
+ if (mono_method_same_domain (ji, target_ji)) {
sparc_call_simple (code, (guint8*)addr - (guint8*)code);
}
}
break;
}
- code = buf = g_malloc (512);
+ code = buf = mono_global_codeman_reserve (512);
sparc_save_imm (code, sparc_sp, -608, sparc_sp);
{
guint8 *ptr, *buf;
- ptr = buf = g_malloc0 (16);
+ ptr = buf = mono_global_codeman_reserve (16);
if (notification_address)
*notification_address = buf;