blob: 072253ad9d40f7f414d504a09065b8320d663826 [file] [log] [blame]
//===--------- Disassembler.cc - Intefarce to disassembler ----------------===//
//
// Micro Virtual Machine
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "vmkit/JIT.h"
#ifdef HAVE_DISASSEMBLER
#if defined(__PPC__)
extern "C"
{
# include <dis-asm.h>
# include <bfd.h>
}
static struct disassemble_info info;
static int initialised= 0;
// this is the only function exported from this file
int vmkit::VmkitModule::disassemble(unsigned int *addr)
{
if (!initialised)
{
INIT_DISASSEMBLE_INFO(info, stdout, fprintf);
info.flavour= bfd_target_elf_flavour;
info.arch= bfd_arch_powerpc;
info.mach= bfd_mach_ppc_750; // generic(ish) == PPC G3
info.endian= BFD_ENDIAN_BIG;
info.buffer_length= 65536;
}
info.buffer= (bfd_byte *)addr;
info.buffer_vma= (bfd_vma)(long)addr;
return print_insn_big_powerpc((bfd_vma)(long)addr, &info);
}
#elif defined(__i386__)
extern "C"
{
# include <bfd.h> // bfd types
# include <dis-asm.h> // disassemble_info
int print_insn_i386_att(bfd_vma, disassemble_info *);
}
static struct disassemble_info info;
static int initialised= 0;
int vmkit::VmkitModule::disassemble(unsigned int *addr)
{
if (!initialised)
{
INIT_DISASSEMBLE_INFO(info, stdout, fprintf);
info.flavour= bfd_target_elf_flavour;
info.arch= bfd_arch_i386;
info.mach= bfd_mach_i386_i386;
info.endian= BFD_ENDIAN_LITTLE;
info.buffer_length= 65536;
}
info.buffer= (bfd_byte *)addr;
info.buffer_vma= (bfd_vma)(long)addr;
return print_insn_i386_att((bfd_vma)(long)addr, &info);
}
#else
int vmkit::VmkitModule::disassemble(unsigned int* addr) {
return 0;
}
#endif
#else
int vmkit::VmkitModule::disassemble(unsigned int* addr) {
return 0;
}
#endif