/* src/vm/jit/powerpc/disass.c - wrapper functions for GNU binutils disassembler
- Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
- R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
- C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
- Institut f. Computersprachen - TU Wien
+ Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
+ C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
+ E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
+ J. Wenninger, Institut f. Computersprachen - TU Wien
This file is part of CACAO.
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., 59 Temple Place - Suite 330, Boston, MA
- 02111-1307, USA.
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA.
- Contact: cacao@complang.tuwien.ac.at
+ Contact: cacao@cacaojvm.org
Authors: Andreas Krall
Reinhard Grafl
Changes: Stefan Ring
Christian Thalinger
- $Id: disass.c 2807 2005-06-23 13:51:33Z twisti $
+ $Id: disass.c 4712 2006-03-30 11:59:46Z twisti $
*/
-#include <stdarg.h>
-#include <string.h>
-#include <assert.h>
-#include "disass.h"
-#include "dis-asm.h"
-
-char *regs[] = {
- "r0",
- "r1",
- "r2",
- "r3",
- "r4",
- "r5",
- "r6",
- "r7",
- "r8",
- "r9",
- "r10",
- "r11",
- "r12",
- "r13",
- "r14",
- "r15",
- "r16",
- "r17",
- "r18",
- "r19",
- "r20",
- "r21",
- "r22",
- "r23",
- "r24",
- "r25",
- "r26",
- "r27",
- "r28",
- "r29",
- "r30",
- "r31",
-};
-
-
-void myprintf(PTR p, const char *fmt, ...)
-{
- va_list ap;
- va_start(ap, fmt);
- vprintf(fmt, ap);
- va_end(ap);
- fflush(stdout);
-}
-
-
-int buffer_read_memory(bfd_vma memaddr, bfd_byte *myaddr, unsigned int length, struct disassemble_info *info)
-{
- memcpy(myaddr, (void*) memaddr, length);
- return 0;
-}
+#include "config.h"
+#include <dis-asm.h>
+#include <stdio.h>
-void perror_memory(int status, bfd_vma memaddr, struct disassemble_info *info)
-{
- assert(0);
-}
-
+#include "vm/types.h"
-void generic_print_address(bfd_vma addr, struct disassemble_info *info)
-{
-/* myprintf(NULL, "0x%x", addr - (u4) info->application_data); */
- myprintf(NULL, "0x%08x", addr);
-}
+#include "vm/global.h"
+#include "vm/jit/disass.h"
-int generic_symbol_at_address(bfd_vma addr, struct disassemble_info *info)
-{
- assert(0);
-}
+/* disassinstr *****************************************************************
+ Outputs a disassembler listing of one machine code instruction on
+ `stdout'.
-unsigned long bfd_getb32(void *buf)
-{
- return *(unsigned long *) buf;
-}
+ code: pointer to machine code
+*******************************************************************************/
-unsigned long bfd_getl32(void *buf)
+u1 *disassinstr(u1 *code)
{
- return *(unsigned long *) buf;
-}
-
+ if (!disass_initialized) {
+ INIT_DISASSEMBLE_INFO(info, NULL, disass_printf);
-void sprintf_vma(char *buf, bfd_vma disp)
-{
- sprintf(buf, "0x%x", disp);
-}
+ /* setting the struct members must be done after
+ INIT_DISASSEMBLE_INFO */
+ info.read_memory_func = &disass_buffer_read_memory;
-void disassinstr(s4 *code)
-{
- disassemble_info info;
+ disass_initialized = true;
+ }
- printf("0x%08x: %08x ", (s4) code, *code);
+ printf("0x%08x: %08x ", (s4) code, *((s4 *) code));
- INIT_DISASSEMBLE_INFO(info, NULL, myprintf);
-/* info.application_data = (u4) code - pos; */
print_insn_big_powerpc((bfd_vma) code, &info);
- printf("\n");
-}
+ printf("\n");
-void disassemble(s4 *code, s4 len)
-{
- s4 i;
- disassemble_info info;
-
- INIT_DISASSEMBLE_INFO(info, NULL, myprintf);
-/* info.application_data = code; */
- printf (" --- disassembler listing ---\n");
- for (i = 0; i < len; i += 4, code++)
- disassinstr(code);
+ return code + 4;
}