int MR_get_register_number_long(MR_LongLval locn) { MR_LongLvalType type; type = MR_LONG_LVAL_TYPE(locn); if (type == MR_LONG_LVAL_TYPE_R || type == MR_LONG_LVAL_TYPE_F) { return MR_LONG_LVAL_NUMBER(locn); } else { return -1; } }
static void MR_dump_long_value(MR_LongLval locn, MR_MemoryZone *heap_zone, MR_Word *stack_pointer, MR_Word *current_frame, MR_bool do_regs) { int locn_num; MR_Word value; int difference; MR_bool have_value; value = 0; have_value = MR_FALSE; locn_num = MR_LONG_LVAL_NUMBER(locn); switch (MR_LONG_LVAL_TYPE(locn)) { case MR_LONG_LVAL_TYPE_R: if (do_regs) { value = MR_virtual_reg_value(locn_num); have_value = MR_TRUE; fprintf(stderr, "r%d\t", locn_num); } else { fprintf(stderr, "r%d (invalid)\t", locn_num); } break; case MR_LONG_LVAL_TYPE_F: fprintf(stderr, "f%d\t", locn_num); break; case MR_LONG_LVAL_TYPE_STACKVAR: value = MR_based_stackvar(stack_pointer, locn_num); have_value = MR_TRUE; fprintf(stderr, "stackvar%d", locn_num); break; case MR_LONG_LVAL_TYPE_FRAMEVAR: value = MR_based_framevar(current_frame, locn_num); have_value = MR_TRUE; fprintf(stderr, "framevar%d", locn_num); break; case MR_LONG_LVAL_TYPE_SUCCIP: fprintf(stderr, "succip"); break; case MR_LONG_LVAL_TYPE_MAXFR: fprintf(stderr, "maxfr"); break; case MR_LONG_LVAL_TYPE_CURFR: fprintf(stderr, "curfr"); break; case MR_LONG_LVAL_TYPE_HP: fprintf(stderr, "hp"); break; case MR_LONG_LVAL_TYPE_SP: fprintf(stderr, "sp"); break; case MR_LONG_LVAL_TYPE_INDIRECT: fprintf(stderr, "offset %d from ", MR_LONG_LVAL_INDIRECT_OFFSET(locn_num)); // XXX Tyson will have to complete this // based on what he wants this function to do. case MR_LONG_LVAL_TYPE_UNKNOWN: fprintf(stderr, "unknown"); break; default: fprintf(stderr, "LONG DEFAULT"); break; } if (have_value) { if (value >= (MR_Word) heap_zone->MR_zone_min && value < (MR_Word) heap_zone->MR_zone_hardmax) { difference = (MR_Word *) value - (MR_Word *) heap_zone->MR_zone_min; fprintf(stderr, "\thp[%d]\t(%lx)", difference, (long) value); } else { fprintf(stderr, "\t \t(%lx)", (long) value); } } }
void MR_agc_dump_stack_frames(MR_Internal *label, MR_MemoryZone *heap_zone, MR_Word *stack_pointer, MR_Word *current_frame) { MR_Word saved_regs[MR_MAX_FAKE_REG]; int i; int short_var_count; int long_var_count; MR_Word *type_params; MR_TypeInfo type_info; MR_Word value; const MR_ProcLayout *entry_layout; const MR_LabelLayout *layout; const MR_Code *success_ip; MR_bool top_frame; layout = label->MR_internal_layout; success_ip = label->MR_internal_addr; entry_layout = layout->MR_sll_entry; // For each stack frame... top_frame = MR_TRUE; while (MR_DETISM_DET_STACK(entry_layout->MR_sle_detism)) { if (label->MR_internal_name != NULL) { fprintf(stderr, " label: %s\n", label->MR_internal_name); } else { fprintf(stderr, " label: %p\n", label->MR_internal_addr); } if (success_ip == MR_stack_trace_bottom_ip) { break; } MR_dump_live_variables(layout, heap_zone, top_frame, stack_pointer, current_frame); // Move to the next stack frame. { MR_LongLval location; MR_LongLvalType type; int number; location = entry_layout->MR_sle_succip_locn; type = MR_LONG_LVAL_TYPE(location); number = MR_LONG_LVAL_NUMBER(location); if (type != MR_LONG_LVAL_TYPE_STACKVAR) { MR_fatal_error("can only handle stackvars"); } success_ip = (MR_Code *) MR_based_stackvar(stack_pointer, number); stack_pointer = stack_pointer - entry_layout->MR_sle_stack_slots; label = MR_lookup_internal_by_addr(success_ip); } top_frame = MR_FALSE; layout = label->MR_internal_layout; if (layout != NULL) { entry_layout = layout->MR_sll_entry; } } }