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