/* src/vm/jit/intrp/disass.c - disassembler wrapper for interpreter Copyright (C) 1996-2005, 2006, 2008 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO This file is part of CACAO. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "config.h" #include #include "vm/types.h" #include "vm/jit/intrp/intrp.h" /* function disassinstr ******************************************************** outputs a disassembler listing of one machine code instruction on 'stdout' c: instructions machine code *******************************************************************************/ u1 *intrp_disassinstr(u1 *code) { FILE *savedout; u1 *r; savedout = vm_out; vm_out = stdout; r = (u1 *) vm_disassemble_inst((Inst *) code, vm_prim); vm_out = savedout; return r; } /* function disassemble ******************************************************** outputs a disassembler listing of some machine code on 'stdout' code: pointer to first instruction len: code size (number of instructions * 4) *******************************************************************************/ void intrp_disassemble(u1 *start, u1 *end) { FILE *savedout; printf(" --- disassembler listing ---\n"); savedout = vm_out; vm_out = stdout; vm_disassemble((Inst *) start, (Inst *) end, vm_prim); vm_out = savedout; } void printarg_ui (u4 ui ) { fprintf(vm_out, "%ud", ui); } void printarg_v (Cell v ) { fprintf(vm_out, "%lld", (long long)v); } void printarg_Cell (Cell x ) { fprintf(vm_out, "%lld", (long long)x); } void printarg_b (s4 b ) { fprintf(vm_out, "%d", b); } void printarg_s (s4 s ) { fprintf(vm_out, "%d", s); } void printarg_i (s4 i ) { fprintf(vm_out, "%d", i); } void printarg_l (s8 l ) { fprintf(vm_out, "%lld", (long long)l); } void printarg_f (float f ) { fprintf(vm_out, "%f", (double)f); } void printarg_d (double d ) { fprintf(vm_out, "%f", d); } void printarg_aRef (java_objectheader *aRef ) { fprintf(vm_out, "obj: %p", (void *)aRef); } void printarg_aArray (java_arrayheader * aArray ) { fprintf(vm_out, "array %p", (void *)aArray); } void printarg_aaTarget(Inst ** aaTarget) { if (aaTarget) { methodinfo *m=((methodinfo **)aaTarget)[3]; printarg_am(m); } else fprintf(vm_out, "NULL"); } void printarg_aClass (classinfo * aClass ) { if (aClass) utf_fprint_printable_ascii_classname(vm_out, aClass->name); else fprintf(vm_out, "NULL"); } void printarg_acr (constant_classref *acr ) { fprintf(vm_out, "cr: %p", (void *)acr); } void printarg_addr (u1 * addr ) { fprintf(vm_out, "%p", (void *)addr); } void printarg_af (functionptr af ) { fprintf(vm_out, "f: %p", (void *)af); } void printarg_afi (fieldinfo * afi ) { if (afi) { utf_fprint_printable_ascii_classname(vm_out, afi->clazz->name); fprintf(vm_out, "."); utf_fprint_printable_ascii(vm_out, afi->name); utf_fprint_printable_ascii(vm_out, afi->descriptor); } else fprintf(vm_out, "fi=NULL"); } void printarg_am (methodinfo * am ) { if (am) { utf_fprint_printable_ascii_classname(vm_out, am->clazz->name); fprintf(vm_out, "."); utf_fprint_printable_ascii(vm_out, am->name); utf_fprint_printable_ascii(vm_out, am->descriptor); } else fprintf(vm_out, "m=NULL"); } void printarg_acell (Cell * acell ) { fprintf(vm_out, "%p", (void *)acell); } void printarg_ainst (Inst * ainst ) { fprintf(vm_out, "%p", (void *)ainst); } void printarg_auf (unresolved_field * auf ) { if (auf) { utf_fprint_printable_ascii(vm_out, auf->fieldref->name); fprintf(vm_out, " (type "); utf_fprint_printable_ascii(vm_out, auf->fieldref->descriptor); fprintf(vm_out, ")"); } else fprintf(vm_out, "NULL"); } void printarg_aum (unresolved_method *aum ) { if (aum) { utf_fprint_printable_ascii_classname(vm_out, METHODREF_CLASSNAME(aum->methodref)); fprintf(vm_out, "."); utf_fprint_printable_ascii(vm_out, aum->methodref->name); utf_fprint_printable_ascii(vm_out, aum->methodref->descriptor); } else fprintf(vm_out, "NULL"); } void printarg_avftbl (vftbl_t * avftbl ) { if (avftbl) { fprintf(vm_out, "vftbl: "); utf_fprint_printable_ascii_classname(vm_out, avftbl->class->name); } else fprintf(vm_out, "NULL"); } /* * These are local overrides for various environment variables in Emacs. * Please do not remove this and leave it at the end of the file, where * Emacs will automagically detect them. * --------------------------------------------------------------------- * Local variables: * mode: c++ * indent-tabs-mode: t * c-basic-offset: 4 * tab-width: 4 * End: * vim:noexpandtab:sw=4:ts=4: */