/* Arguments are pushed in the reverse order */
for (i = n - 1; i >= 0; i --) {
ArgInfo *ainfo = cinfo->args + i;
- MonoType *t;
+ MonoType *orig_type, *t;
int argsize;
if (cinfo->vtype_retaddr && cinfo->vret_arg_index == 1 && i == 0) {
t = sig->params [i - sig->hasthis];
else
t = &mono_defaults.int_class->byval_arg;
+ orig_type = t;
t = mini_type_get_underlying_type (cfg->generic_sharing_context, t);
MONO_INST_NEW (cfg, arg, OP_X86_PUSH);
MONO_ADD_INS (cfg->cbb, arg);
sp_offset += size;
- emit_gc_param_slot_def (cfg, sp_offset, t);
+ emit_gc_param_slot_def (cfg, sp_offset, orig_type);
}
} else {
argsize = 4;
if (cfg->compute_gc_maps) {
if (argsize == 4) {
/* FIXME: The == STACK_OBJ check might be fragile ? */
- if (sig->hasthis && i == 0 && call->args [i]->type == STACK_OBJ)
+ if (sig->hasthis && i == 0 && call->args [i]->type == STACK_OBJ) {
/* this */
- emit_gc_param_slot_def (cfg, sp_offset, &mono_defaults.object_class->byval_arg);
- else
- emit_gc_param_slot_def (cfg, sp_offset, t);
+ if (call->need_unbox_trampoline)
+ /* The unbox trampoline transforms this into a managed pointer */
+ emit_gc_param_slot_def (cfg, sp_offset, &mono_defaults.int_class->this_arg);
+ else
+ emit_gc_param_slot_def (cfg, sp_offset, &mono_defaults.object_class->byval_arg);
+ } else {
+ emit_gc_param_slot_def (cfg, sp_offset, orig_type);
+ }
} else {
/* i8/r8 */
for (j = 0; j < argsize; j += 4)
MonoCallInst *call = (MonoCallInst*)ins;
int pos = 0, i;
+ ins->flags |= MONO_INST_GC_CALLSITE;
+ ins->backend.pc_offset = code - cfg->native_code;
+
/* FIXME: no tracing support... */
if (cfg->prof_options & MONO_PROFILE_ENTER_LEAVE)
code = mono_arch_instrument_epilog (cfg, mono_profiler_method_leave, code, FALSE);
{
if ((code [0] == 0x8b) && (x86_modrm_mod (code [1]) == 0x2))
return 2;
- else if ((code [0] == 0xba))
+ else if (code [0] == 0xba)
return 1;
- else if ((code [0] == 0x68))
+ else if (code [0] == 0x68)
/* push IMM */
return 1;
else if ((code [0] == 0xff) && (x86_modrm_reg (code [1]) == 0x6))