- for (cindex = 0; cindex < gcfg->ncallsites; ++cindex) {
- GCCallSite *callsite = gcfg->callsites [cindex];
- GSList *l;
-
- for (l = callsite->param_slots; l; l = l->next) {
- MonoInst *def = l->data;
- MonoType *t = def->inst_vtype;
- int sp_offset = def->inst_offset;
- int fp_offset = sp_offset_to_fp_offset (cfg, sp_offset);
- int slot = fp_offset_to_slot (cfg, fp_offset);
- GCSlotType type = type_to_gc_slot_type (cfg, t);
-
- if (MONO_TYPE_ISSTRUCT (t)) {
- guint32 align;
- guint32 size;
- int size_in_slots;
-
- size = mini_type_stack_size_full (cfg->generic_sharing_context, t, &align, FALSE);
- size_in_slots = ALIGN_TO (size, SIZEOF_SLOT) / SIZEOF_SLOT;
- // FIXME: slot type
- for (i = 0; i < size_in_slots; ++i) {
- set_slot_in_range (gcfg, slot + i, def->backend.pc_offset, callsite->pc_offset + 1, type);
- }
- if (cfg->verbose_level > 1)
- printf ("\t%s param area slots at %s0x%x(fp)=0x%x(sp) (slot = %d-%d) [0x%x-0x%x]\n", slot_type_to_string (type), fp_offset >= 0 ? "+" : "-", ABS (fp_offset), sp_offset, slot, slot + (size / (int)sizeof (mgreg_t)), def->backend.pc_offset, callsite->pc_offset + 1);
- } else {
- /* The slot is live between the def instruction and the call */
- set_slot_in_range (gcfg, slot, def->backend.pc_offset, callsite->pc_offset + 1, type);
- if (cfg->verbose_level > 1)
- printf ("\t%s param area slot at %s0x%x(fp)=0x%x(sp) (slot = %d) [0x%x-0x%x]\n", slot_type_to_string (type), fp_offset >= 0 ? "+" : "-", ABS (fp_offset), sp_offset, slot, def->backend.pc_offset, callsite->pc_offset + 1);
- }
- }
- }