improved error backtraces for a few for JIT-inlined primitives, notably 'car' and 'cdr'

svn: r12607
This commit is contained in:
Matthew Flatt 2008-11-27 00:47:18 +00:00
parent 2c78076fe6
commit 792ab171b0

View File

@ -2315,6 +2315,15 @@ typedef struct {
int direct_prim, direct_native, nontail_self;
} Generate_Call_Data;
static void register_sub_func(mz_jit_state *jitter, void *code, Scheme_Object *protocol)
{
void *code_end;
code_end = jit_get_ip().ptr;
if (jitter->retain_start)
add_symbol((unsigned long)code, (unsigned long)code_end - 1, protocol, 0);
}
int do_generate_shared_call(mz_jit_state *jitter, void *_data)
{
Generate_Call_Data *data = (Generate_Call_Data *)_data;
@ -2330,7 +2339,7 @@ int do_generate_shared_call(mz_jit_state *jitter, void *_data)
return generate_tail_call(jitter, data->num_rands, data->direct_native, 1);
} else {
int ok;
void *code, *code_end;
void *code;
code = jit_get_ip().ptr;
@ -2339,9 +2348,7 @@ int do_generate_shared_call(mz_jit_state *jitter, void *_data)
else
ok = generate_non_tail_call(jitter, data->num_rands, data->direct_native, 1, data->multi_ok, data->nontail_self, 1);
code_end = jit_get_ip().ptr;
if (jitter->retain_start)
add_symbol((unsigned long)code, (unsigned long)code_end - 1, scheme_false, 0);
register_sub_func(jitter, code, scheme_false);
return ok;
}
@ -3923,22 +3930,22 @@ static int generate_inlined_unary(mz_jit_state *jitter, Scheme_App2_Rec *app, in
__END_TINY_JUMPS__(1);
if (steps == 1) {
if (name[1] == 'a') {
(void)jit_jmpi(bad_car_code);
(void)jit_calli(bad_car_code);
} else {
(void)jit_jmpi(bad_cdr_code);
(void)jit_calli(bad_cdr_code);
}
} else {
if (name[1] == 'a') {
if (name[2] == 'a') {
(void)jit_jmpi(bad_caar_code);
(void)jit_calli(bad_caar_code);
} else {
(void)jit_jmpi(bad_cadr_code);
(void)jit_calli(bad_cadr_code);
}
} else {
if (name[2] == 'a') {
(void)jit_jmpi(bad_cdar_code);
(void)jit_calli(bad_cdar_code);
} else {
(void)jit_jmpi(bad_cddr_code);
(void)jit_calli(bad_cddr_code);
}
}
}
@ -3980,9 +3987,9 @@ static int generate_inlined_unary(mz_jit_state *jitter, Scheme_App2_Rec *app, in
reffail = _jit.x.pc;
__END_TINY_JUMPS__(1);
if (name[2] == 'a') {
(void)jit_jmpi(bad_mcar_code);
(void)jit_calli(bad_mcar_code);
} else {
(void)jit_jmpi(bad_mcdr_code);
(void)jit_calli(bad_mcdr_code);
}
__START_TINY_JUMPS__(1);
mz_patch_branch(ref);
@ -4015,7 +4022,7 @@ static int generate_inlined_unary(mz_jit_state *jitter, Scheme_App2_Rec *app, in
__END_TINY_JUMPS__(1);
reffail = _jit.x.pc;
(void)jit_jmpi(bad_vector_length_code);
(void)jit_calli(bad_vector_length_code);
__START_TINY_JUMPS__(1);
mz_patch_branch(ref);
@ -4045,7 +4052,7 @@ static int generate_inlined_unary(mz_jit_state *jitter, Scheme_App2_Rec *app, in
__END_TINY_JUMPS__(1);
reffail = _jit.x.pc;
(void)jit_jmpi(bad_unbox_code);
(void)jit_calli(bad_unbox_code);
__START_TINY_JUMPS__(1);
mz_patch_branch(ref);
@ -4552,9 +4559,9 @@ static int generate_inlined_binary(mz_jit_state *jitter, Scheme_App3_Rec *app, i
reffail = _jit.x.pc;
__END_TINY_JUMPS__(1);
if (set_mcar)
(void)jit_jmpi(bad_set_mcar_code);
(void)jit_calli(bad_set_mcar_code);
else
(void)jit_jmpi(bad_set_mcdr_code);
(void)jit_calli(bad_set_mcdr_code);
__START_TINY_JUMPS__(1);
mz_patch_branch(ref);
jit_ldxi_s(JIT_R2, JIT_R0, &((Scheme_Object *)0x0)->type);
@ -6443,32 +6450,36 @@ static int do_generate_common(mz_jit_state *jitter, void *_data)
/* *** bad_[m]{car,cdr,...}_code *** */
/* Bad argument is in R0 for car/cdr, R2 otherwise */
for (i = 0; i < 8; i++) {
void *code;
code = jit_get_ip().ptr;
switch (i) {
case 0:
bad_car_code = jit_get_ip().ptr;
bad_car_code = code;
break;
case 1:
bad_cdr_code = jit_get_ip().ptr;
bad_cdr_code = code;
break;
case 2:
bad_caar_code = jit_get_ip().ptr;
bad_caar_code = code;
break;
case 3:
bad_cadr_code = jit_get_ip().ptr;
bad_cadr_code = code;
break;
case 4:
bad_cdar_code = jit_get_ip().ptr;
bad_cdar_code = code;
break;
case 5:
bad_cddr_code = jit_get_ip().ptr;
bad_cddr_code = code;
break;
case 6:
bad_mcar_code = jit_get_ip().ptr;
bad_mcar_code = code;
break;
case 7:
bad_mcdr_code = jit_get_ip().ptr;
bad_mcdr_code = code;
break;
}
mz_prolog(JIT_R1);
jit_subi_p(JIT_RUNSTACK, JIT_RUNSTACK, WORDS_TO_BYTES(1));
CHECK_RUNSTACK_OVERFLOW();
if ((i < 2) || (i > 5)) {
@ -6509,19 +6520,24 @@ static int do_generate_common(mz_jit_state *jitter, void *_data)
break;
}
CHECK_LIMIT();
register_sub_func(jitter, code, scheme_false);
}
/* *** bad_set_{car,cdr}_code *** */
/* Bad argument is in R0, other is in R1 */
for (i = 0; i < 2; i++) {
void *code;
code = jit_get_ip().ptr;
switch (i) {
case 0:
bad_set_mcar_code = jit_get_ip().ptr;
bad_set_mcar_code = code;
break;
case 1:
bad_set_mcdr_code = jit_get_ip().ptr;
bad_set_mcdr_code = code;
break;
}
mz_prolog(JIT_R1);
jit_subi_p(JIT_RUNSTACK, JIT_RUNSTACK, WORDS_TO_BYTES(2));
CHECK_RUNSTACK_OVERFLOW();
jit_str_p(JIT_RUNSTACK, JIT_R0);
@ -6541,29 +6557,34 @@ static int do_generate_common(mz_jit_state *jitter, void *_data)
break;
}
CHECK_LIMIT();
register_sub_func(jitter, code, scheme_false);
}
/* *** bad_unbox_code *** */
/* R0 is argument */
bad_unbox_code = jit_get_ip().ptr;
mz_prolog(JIT_R1);
jit_prepare(1);
jit_pusharg_i(JIT_R0);
(void)mz_finish(scheme_unbox);
CHECK_LIMIT();
register_sub_func(jitter, bad_unbox_code, scheme_false);
/* *** bad_vector_length_code *** */
/* R0 is argument */
bad_vector_length_code = jit_get_ip().ptr;
mz_prolog(JIT_R1);
jit_prepare(1);
jit_pusharg_i(JIT_R0);
(void)mz_finish(scheme_vector_length);
CHECK_LIMIT();
register_sub_func(jitter, bad_vector_length_code, scheme_false);
/* *** call_original_unary_arith_code *** */
/* R0 is arg, R2 is code pointer, V1 is return address */
for (i = 0; i < 3; i++) {
int argc, j;
void *code, *code_end;
void *code;
for (j = 0; j < 2; j++) {
code = jit_get_ip().ptr;
if (!i) {
@ -6625,9 +6646,7 @@ static int do_generate_common(mz_jit_state *jitter, void *_data)
}
CHECK_LIMIT();
code_end = jit_get_ip().ptr;
if (jitter->retain_start)
add_symbol((unsigned long)code, (unsigned long)code_end - 1, scheme_void, 0);
register_sub_func(jitter, code, scheme_void);
}
}