コード例 #1
0
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;
    }
}
コード例 #2
0
ファイル: mercury_agc_debug.c プロジェクト: htzh/mercury
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);
        }
    }
}
コード例 #3
0
ファイル: mercury_agc_debug.c プロジェクト: htzh/mercury
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;
        }
    }
}