1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-04 22:40:25 +02:00

Add new --enable-devel-disassembler configure option

* configure.ac, include/lightning/jit_private.h,
	lib/jit_aarch64.c, lib/jit_alpha.c, lib/jit_arm.c,
	lib/jit_disasm.c, lib/jit_hppa.c, lib/jit_ia64.c,
	lib/jit_mips.c, lib/jit_ppc.c, lib/jit_print.c,
	lib/jit_s390.c, lib/jit_sparc.c, lib/jit_x86.c: Add a new
	--enable-devel-disassembler option, that should be used
	during development, or lightning debug. This option
	intermixes previous jit_print and jit_disassemble
	output, making it easier to visualize what lightning
	call was used, and what code was generated.
This commit is contained in:
Paulo Andrade 2015-02-02 20:49:22 -02:00
parent 1b055bf0d8
commit 678280734e
15 changed files with 230 additions and 149 deletions

View file

@ -1,3 +1,16 @@
2015-02-02 Paulo Andrade <pcpa@gnu.org>
* configure.ac, include/lightning/jit_private.h,
lib/jit_aarch64.c, lib/jit_alpha.c, lib/jit_arm.c,
lib/jit_disasm.c, lib/jit_hppa.c, lib/jit_ia64.c,
lib/jit_mips.c, lib/jit_ppc.c, lib/jit_print.c,
lib/jit_s390.c, lib/jit_sparc.c, lib/jit_x86.c: Add a new
--enable-devel-disassembler option, that should be used
during development, or lightning debug. This option
intermixes previous jit_print and jit_disassemble
output, making it easier to visualize what lightning
call was used, and what code was generated.
2015-01-31 Paulo Andrade <pcpa@gnu.org> 2015-01-31 Paulo Andrade <pcpa@gnu.org>
* lib/jit_arm-cpu.c, lib/jit_arm.c: Only limit to 24 bit * lib/jit_arm-cpu.c, lib/jit_arm.c: Only limit to 24 bit

View file

@ -95,6 +95,17 @@ if test "x$DISASSEMBLER" != "xno"; then
LIGHTNING_CFLAGS="$LIGHTNING_CFLAGS -DDISASSEMBLER=1" LIGHTNING_CFLAGS="$LIGHTNING_CFLAGS -DDISASSEMBLER=1"
fi fi
AC_ARG_ENABLE(devel-disassembler,
AS_HELP_STRING([--enable-devel-disassembler],
[Enable extra disassembly options]),
[DEVEL_DISASSEMBLER=$enableval], [DEVEL_DISASSEMBLER=no])
if test "x$DEVEL_DISASSEMBLER" != "xno"; then
if test "x$DISASSEMBLER" = "xno"; then
AC_MSG_ERROR(devel-disassembler needs disassembler enabled)
fi
LIGHTNING_CFLAGS="$LIGHTNING_CFLAGS -DDEVEL_DISASSEMBLER=1"
fi
AC_ARG_ENABLE(assertions, AC_ARG_ENABLE(assertions,
AS_HELP_STRING([--enable-assertions], AS_HELP_STRING([--enable-assertions],
[Enable runtime code generation assertions]), [Enable runtime code generation assertions]),

View file

@ -303,6 +303,9 @@ struct jit_node {
jit_data_t v; jit_data_t v;
jit_data_t w; jit_data_t w;
jit_node_t *link; jit_node_t *link;
#if DEVEL_DISASSEMBLER
jit_uword_t offset;
#endif
}; };
struct jit_block { struct jit_block {
@ -618,6 +621,9 @@ extern void _jit_set_note(jit_state_t*, jit_note_t*, char*, int, jit_int32_t);
#define jit_annotate() _jit_annotate(_jit) #define jit_annotate() _jit_annotate(_jit)
extern void _jit_annotate(jit_state_t*); extern void _jit_annotate(jit_state_t*);
#define jit_print_node(u) _jit_print_node(_jit,u)
extern void _jit_print_node(jit_state_t*,jit_node_t*);
extern jit_pointer_t jit_memcpy(jit_pointer_t,const void*,jit_word_t); extern jit_pointer_t jit_memcpy(jit_pointer_t,const void*,jit_word_t);
extern jit_pointer_t jit_memmove(jit_pointer_t,const void*,jit_word_t); extern jit_pointer_t jit_memmove(jit_pointer_t,const void*,jit_word_t);
extern void jit_alloc(jit_pointer_t*, jit_word_t); extern void jit_alloc(jit_pointer_t*, jit_word_t);

View file

@ -791,6 +791,9 @@ _emit_code(jit_state_t *_jit)
if (_jit->pc.uc >= _jitc->code.end) if (_jit->pc.uc >= _jitc->code.end)
return (NULL); return (NULL);
#if DEVEL_DISASSEMBLER
node->offset = _jit->pc.w;
#endif
value = jit_classify(node->code); value = jit_classify(node->code);
jit_regarg_set(node, value); jit_regarg_set(node, value);
switch (node->code) { switch (node->code) {

View file

@ -784,6 +784,9 @@ _emit_code(jit_state_t *_jit)
if (_jit->pc.uc >= _jitc->code.end) if (_jit->pc.uc >= _jitc->code.end)
return (NULL); return (NULL);
#if DEVEL_DISASSEMBLER
node->offset = _jit->pc.w;
#endif
value = jit_classify(node->code); value = jit_classify(node->code);
jit_regarg_set(node, value); jit_regarg_set(node, value);
switch (node->code) { switch (node->code) {

View file

@ -1186,6 +1186,9 @@ _emit_code(jit_state_t *_jit)
if (_jit->pc.uc >= _jitc->code.end) if (_jit->pc.uc >= _jitc->code.end)
return (NULL); return (NULL);
#if DEVEL_DISASSEMBLER
node->offset = _jit->pc.w;
#endif
value = jit_classify(node->code); value = jit_classify(node->code);
jit_regarg_set(node, value); jit_regarg_set(node, value);
switch (node->code) { switch (node->code) {

View file

@ -327,6 +327,9 @@ _disassemble(jit_state_t *_jit, jit_pointer_t code, jit_int32_t length)
bfd_vma pc = (jit_uword_t)code; bfd_vma pc = (jit_uword_t)code;
bfd_vma end = (jit_uword_t)code + length; bfd_vma end = (jit_uword_t)code + length;
char buffer[address_buffer_length]; char buffer[address_buffer_length];
#if DEVEL_DISASSEMBLER
jit_node_t *node;
#endif
#if __arm__ #if __arm__
data_info = _jitc && _jitc->data_info.ptr; data_info = _jitc && _jitc->data_info.ptr;
@ -338,7 +341,19 @@ _disassemble(jit_state_t *_jit, jit_pointer_t code, jit_int32_t length)
old_file = old_name = NULL; old_file = old_name = NULL;
old_line = 0; old_line = 0;
disasm_jit = _jit; disasm_jit = _jit;
#if DEVEL_DISASSEMBLER
node = _jitc->head;
#endif
while (pc < end) { while (pc < end) {
#if DEVEL_DISASSEMBLER
while (node && node->offset < (jit_uword_t)pc)
node = node->next;
while (node && node->offset == (jit_uword_t)pc) {
jit_print_node(node);
fputc('\n', stdout);
node = node->next;
}
#endif
#if __arm__ #if __arm__
again: again:
if (data_info) { if (data_info) {

View file

@ -804,6 +804,9 @@ _emit_code(jit_state_t *_jit)
if (_jit->pc.uc >= _jitc->code.end) if (_jit->pc.uc >= _jitc->code.end)
return (NULL); return (NULL);
#if DEVEL_DISASSEMBLER
node->offset = _jit->pc.w;
#endif
value = jit_classify(node->code); value = jit_classify(node->code);
jit_regarg_set(node, value); jit_regarg_set(node, value);
switch (node->code) { switch (node->code) {

View file

@ -913,6 +913,10 @@ _emit_code(jit_state_t *_jit)
value = jit_classify(node->code); value = jit_classify(node->code);
#if GET_JIT_SIZE #if GET_JIT_SIZE
sync(); sync();
#endif
#if DEVEL_DISASSEMBLER
sync();
node->offset = _jit->pc.w;
#endif #endif
jit_regarg_set(node, value); jit_regarg_set(node, value);
switch (node->code) { switch (node->code) {

View file

@ -1069,6 +1069,9 @@ _emit_code(jit_state_t *_jit)
if (_jit->pc.uc >= _jitc->code.end) if (_jit->pc.uc >= _jitc->code.end)
return (NULL); return (NULL);
#if DEVEL_DISASSEMBLER
node->offset = _jit->pc.w;
#endif
value = jit_classify(node->code); value = jit_classify(node->code);
jit_regarg_set(node, value); jit_regarg_set(node, value);
switch (node->code) { switch (node->code) {

View file

@ -931,6 +931,9 @@ _emit_code(jit_state_t *_jit)
if (_jit->pc.uc >= _jitc->code.end) if (_jit->pc.uc >= _jitc->code.end)
return (NULL); return (NULL);
#if DEVEL_DISASSEMBLER
node->offset = _jit->pc.w;
#endif
value = jit_classify(node->code); value = jit_classify(node->code);
jit_regarg_set(node, value); jit_regarg_set(node, value);
switch (node->code) { switch (node->code) {

View file

@ -45,17 +45,24 @@ void
_jit_print(jit_state_t *_jit) _jit_print(jit_state_t *_jit)
{ {
jit_node_t *node; jit_node_t *node;
if ((node = _jitc->head)) {
jit_print_node(node);
for (node = node->next; node; node = node->next) {
print_chr('\n');
jit_print_node(node);
}
print_chr('\n');
}
}
void
_jit_print_node(jit_state_t *_jit, jit_node_t *node)
{
jit_block_t *block; jit_block_t *block;
jit_bool_t first;
jit_int32_t value; jit_int32_t value;
jit_int32_t offset; jit_int32_t offset;
first = 0;
for (node = _jitc->head; node; node = node->next) {
if (!first)
print_chr('\n');
else
first = 0;
if (node->code == jit_code_label || if (node->code == jit_code_label ||
node->code == jit_code_prolog || node->code == jit_code_epilog) { node->code == jit_code_prolog || node->code == jit_code_epilog) {
print_chr('L'); print_chr('L');
@ -74,7 +81,7 @@ _jit_print(jit_state_t *_jit)
print_str(code_name[node->code]); print_str(code_name[node->code]);
print_str(" */"); print_str(" */");
} }
continue; return;
} }
value = jit_classify(node->code) & value = jit_classify(node->code) &
(jit_cc_a0_int|jit_cc_a0_jmp|jit_cc_a0_reg|jit_cc_a0_rlh| (jit_cc_a0_int|jit_cc_a0_jmp|jit_cc_a0_reg|jit_cc_a0_rlh|
@ -87,9 +94,9 @@ _jit_print(jit_state_t *_jit)
print_str(code_name[node->code]); print_str(code_name[node->code]);
switch (node->code) { switch (node->code) {
r: r:
print_chr(' '); print_reg(node->u.w); continue; print_chr(' '); print_reg(node->u.w); return;
w: w:
print_chr(' '); print_hex(node->u.w); continue; print_chr(' '); print_hex(node->u.w); return;
n: n:
print_chr(' '); print_chr(' ');
if (!(node->flag & jit_flag_node)) if (!(node->flag & jit_flag_node))
@ -98,13 +105,13 @@ _jit_print(jit_state_t *_jit)
print_chr('L'); print_chr('L');
print_dec(node->u.n->v.w); print_dec(node->u.n->v.w);
} }
continue; return;
r_r: r_r:
print_chr(' '); print_reg(node->u.w); print_chr(' '); print_reg(node->u.w);
print_chr(' '); print_reg(node->v.w); continue; print_chr(' '); print_reg(node->v.w); return;
r_w: r_w:
print_chr(' '); print_reg(node->u.w); print_chr(' '); print_reg(node->u.w);
print_chr(' '); print_hex(node->v.w); continue; print_chr(' '); print_hex(node->v.w); return;
r_f: r_f:
print_chr(' '); print_reg(node->u.w); print_chr(' '); print_reg(node->u.w);
print_chr(' '); print_chr(' ');
@ -112,7 +119,7 @@ _jit_print(jit_state_t *_jit)
print_flt(*(jit_float32_t *)node->v.n->u.w); print_flt(*(jit_float32_t *)node->v.n->u.w);
else else
print_flt(node->v.f); print_flt(node->v.f);
continue; return;
r_d: r_d:
print_chr(' '); print_reg(node->u.w); print_chr(' '); print_reg(node->u.w);
print_chr(' '); print_chr(' ');
@ -120,28 +127,28 @@ _jit_print(jit_state_t *_jit)
print_flt(*(jit_float64_t *)node->v.n->u.w); print_flt(*(jit_float64_t *)node->v.n->u.w);
else else
print_flt(node->v.d); print_flt(node->v.d);
continue; return;
w_r: w_r:
print_chr(' '); print_hex(node->u.w); print_chr(' '); print_hex(node->u.w);
print_chr(' '); print_reg(node->v.w); continue; print_chr(' '); print_reg(node->v.w); return;
r_r_r: r_r_r:
print_chr(' '); print_reg(node->u.w); print_chr(' '); print_reg(node->u.w);
print_chr(' '); print_reg(node->v.w); print_chr(' '); print_reg(node->v.w);
print_chr(' '); print_reg(node->w.w); continue; print_chr(' '); print_reg(node->w.w); return;
r_r_w: r_r_w:
print_chr(' '); print_reg(node->u.w); print_chr(' '); print_reg(node->u.w);
print_chr(' '); print_reg(node->v.w); print_chr(' '); print_reg(node->v.w);
print_chr(' '); print_hex(node->w.w); continue; print_chr(' '); print_hex(node->w.w); return;
q_r_r: q_r_r:
print_str(" ("); print_reg(node->u.q.l); print_str(" ("); print_reg(node->u.q.l);
print_chr(' '); print_reg(node->u.q.h); print_chr(' '); print_reg(node->u.q.h);
print_str(") "); print_reg(node->v.w); print_str(") "); print_reg(node->v.w);
print_chr(' '); print_reg(node->w.w); continue; print_chr(' '); print_reg(node->w.w); return;
q_r_w: q_r_w:
print_str(" ("); print_reg(node->u.q.l); print_str(" ("); print_reg(node->u.q.l);
print_chr(' '); print_reg(node->u.q.h); print_chr(' '); print_reg(node->u.q.h);
print_str(") "); print_reg(node->v.w); print_str(") "); print_reg(node->v.w);
print_chr(' '); print_hex(node->w.w); continue; print_chr(' '); print_hex(node->w.w); return;
r_r_f: r_r_f:
print_chr(' '); print_reg(node->u.w); print_chr(' '); print_reg(node->u.w);
print_chr(' '); print_reg(node->v.w); print_chr(' '); print_reg(node->v.w);
@ -150,7 +157,7 @@ _jit_print(jit_state_t *_jit)
print_flt(*(jit_float32_t *)node->w.n->u.w); print_flt(*(jit_float32_t *)node->w.n->u.w);
else else
print_flt(node->w.f); print_flt(node->w.f);
continue; return;
r_r_d: r_r_d:
print_chr(' '); print_reg(node->u.w); print_chr(' '); print_reg(node->u.w);
print_chr(' '); print_reg(node->v.w); print_chr(' '); print_reg(node->v.w);
@ -159,11 +166,11 @@ _jit_print(jit_state_t *_jit)
print_flt(*(jit_float64_t *)node->w.n->u.w); print_flt(*(jit_float64_t *)node->w.n->u.w);
else else
print_flt(node->w.d); print_flt(node->w.d);
continue; return;
w_r_r: w_r_r:
print_chr(' '); print_hex(node->u.w); print_chr(' '); print_hex(node->u.w);
print_chr(' '); print_reg(node->v.w); print_chr(' '); print_reg(node->v.w);
print_chr(' '); print_reg(node->w.w); continue; print_chr(' '); print_reg(node->w.w); return;
n_r_r: n_r_r:
print_chr(' '); print_chr(' ');
if (!(node->flag & jit_flag_node)) if (!(node->flag & jit_flag_node))
@ -173,7 +180,7 @@ _jit_print(jit_state_t *_jit)
print_dec(node->u.n->v.w); print_dec(node->u.n->v.w);
} }
print_chr(' '); print_reg(node->v.w); print_chr(' '); print_reg(node->v.w);
print_chr(' '); print_reg(node->w.w); continue; print_chr(' '); print_reg(node->w.w); return;
n_r_w: n_r_w:
print_chr(' '); print_chr(' ');
if (!(node->flag & jit_flag_node)) if (!(node->flag & jit_flag_node))
@ -183,7 +190,7 @@ _jit_print(jit_state_t *_jit)
print_dec(node->u.n->v.w); print_dec(node->u.n->v.w);
} }
print_chr(' '); print_reg(node->v.w); print_chr(' '); print_reg(node->v.w);
print_chr(' '); print_hex(node->w.w); continue; print_chr(' '); print_hex(node->w.w); return;
n_r_f: n_r_f:
print_chr(' '); print_chr(' ');
if (!(node->flag & jit_flag_node)) if (!(node->flag & jit_flag_node))
@ -198,7 +205,7 @@ _jit_print(jit_state_t *_jit)
print_flt(*(jit_float32_t *)node->w.n->u.w); print_flt(*(jit_float32_t *)node->w.n->u.w);
else else
print_flt(node->w.f); print_flt(node->w.f);
continue; return;
n_r_d: n_r_d:
print_chr(' '); print_chr(' ');
if (!(node->flag & jit_flag_node)) if (!(node->flag & jit_flag_node))
@ -213,7 +220,7 @@ _jit_print(jit_state_t *_jit)
print_flt(*(jit_float64_t *)node->w.n->u.w); print_flt(*(jit_float64_t *)node->w.n->u.w);
else else
print_flt(node->w.d); print_flt(node->w.d);
continue; return;
case jit_code_name: case jit_code_name:
print_chr(' '); print_chr(' ');
if (node->v.p && _jitc->emit) if (node->v.p && _jitc->emit)
@ -284,5 +291,3 @@ _jit_print(jit_state_t *_jit)
break; break;
} }
} }
print_chr('\n');
}

View file

@ -808,6 +808,9 @@ _emit_code(jit_state_t *_jit)
if (_jit->pc.uc >= _jitc->code.end) if (_jit->pc.uc >= _jitc->code.end)
return (NULL); return (NULL);
#if DEVEL_DISASSEMBLER
node->offset = _jit->pc.w;
#endif
value = jit_classify(node->code); value = jit_classify(node->code);
jit_regarg_set(node, value); jit_regarg_set(node, value);
switch (node->code) { switch (node->code) {

View file

@ -823,6 +823,9 @@ _emit_code(jit_state_t *_jit)
if (_jit->pc.uc >= _jitc->code.end) if (_jit->pc.uc >= _jitc->code.end)
return (NULL); return (NULL);
#if DEVEL_DISASSEMBLER
node->offset = _jit->pc.w;
#endif
value = jit_classify(node->code); value = jit_classify(node->code);
jit_regarg_set(node, value); jit_regarg_set(node, value);
switch (node->code) { switch (node->code) {

View file

@ -1351,6 +1351,9 @@ _emit_code(jit_state_t *_jit)
if (_jit->pc.uc >= _jitc->code.end) if (_jit->pc.uc >= _jitc->code.end)
return (NULL); return (NULL);
#if DEVEL_DISASSEMBLER
node->offset = _jit->pc.w;
#endif
value = jit_classify(node->code); value = jit_classify(node->code);
jit_regarg_set(node, value); jit_regarg_set(node, value);
switch (node->code) { switch (node->code) {