133965Sjdp/* Select disassembly routine for specified architecture. 2218822Sdim Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 3218822Sdim 2004, 2005, 2006 Free Software Foundation, Inc. 433965Sjdp 5218822Sdim This program is free software; you can redistribute it and/or modify 6218822Sdim it under the terms of the GNU General Public License as published by 7218822Sdim the Free Software Foundation; either version 2 of the License, or 8218822Sdim (at your option) any later version. 933965Sjdp 10218822Sdim This program is distributed in the hope that it will be useful, 11218822Sdim but WITHOUT ANY WARRANTY; without even the implied warranty of 12218822Sdim MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13218822Sdim GNU General Public License for more details. 1433965Sjdp 15218822Sdim You should have received a copy of the GNU General Public License 16218822Sdim along with this program; if not, write to the Free Software 17218822Sdim Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ 1833965Sjdp 1960484Sobrien#include "sysdep.h" 2033965Sjdp#include "dis-asm.h" 2133965Sjdp 2233965Sjdp#ifdef ARCH_all 2333965Sjdp#define ARCH_alpha 2438889Sjdp#define ARCH_arc 2533965Sjdp#define ARCH_arm 2660484Sobrien#define ARCH_avr 27218822Sdim#define ARCH_bfin 28218822Sdim#define ARCH_cr16 2977298Sobrien#define ARCH_cris 30218822Sdim#define ARCH_crx 3133965Sjdp#define ARCH_d10v 3260484Sobrien#define ARCH_d30v 33104834Sobrien#define ARCH_dlx 34218822Sdim#define ARCH_fr30 35218822Sdim#define ARCH_frv 3633965Sjdp#define ARCH_h8300 3733965Sjdp#define ARCH_h8500 3833965Sjdp#define ARCH_hppa 3960484Sobrien#define ARCH_i370 4033965Sjdp#define ARCH_i386 4177298Sobrien#define ARCH_i860 4233965Sjdp#define ARCH_i960 43218822Sdim#define ARCH_ia64 44130561Sobrien#define ARCH_ip2k 45218822Sdim#define ARCH_iq2000 46218822Sdim#define ARCH_m32c 4733965Sjdp#define ARCH_m32r 4877298Sobrien#define ARCH_m68hc11 4977298Sobrien#define ARCH_m68hc12 50218822Sdim#define ARCH_m68k 5133965Sjdp#define ARCH_m88k 52218822Sdim#define ARCH_maxq 5360484Sobrien#define ARCH_mcore 54218822Sdim#define ARCH_mep 5533965Sjdp#define ARCH_mips 5689857Sobrien#define ARCH_mmix 5733965Sjdp#define ARCH_mn10200 5833965Sjdp#define ARCH_mn10300 59218822Sdim#define ARCH_mt 60130561Sobrien#define ARCH_msp430 6133965Sjdp#define ARCH_ns32k 6289857Sobrien#define ARCH_openrisc 6391041Sobrien#define ARCH_or32 6489857Sobrien#define ARCH_pdp11 6560484Sobrien#define ARCH_pj 6633965Sjdp#define ARCH_powerpc 6733965Sjdp#define ARCH_rs6000 6889857Sobrien#define ARCH_s390 69218822Sdim#define ARCH_score 7033965Sjdp#define ARCH_sh 7133965Sjdp#define ARCH_sparc 72218822Sdim#define ARCH_spu 7338889Sjdp#define ARCH_tic30 74130561Sobrien#define ARCH_tic4x 7577298Sobrien#define ARCH_tic54x 7660484Sobrien#define ARCH_tic80 7738889Sjdp#define ARCH_v850 7860484Sobrien#define ARCH_vax 7933965Sjdp#define ARCH_w65 8089857Sobrien#define ARCH_xstormy16 81218822Sdim#define ARCH_xc16x 82130561Sobrien#define ARCH_xtensa 83218822Sdim#define ARCH_z80 8433965Sjdp#define ARCH_z8k 8591041Sobrien#define INCLUDE_SHMEDIA 8633965Sjdp#endif 8733965Sjdp 88218822Sdim#ifdef ARCH_m32c 89218822Sdim#include "m32c-desc.h" 90218822Sdim#endif 9138889Sjdp 9233965Sjdpdisassembler_ftype 9333965Sjdpdisassembler (abfd) 9433965Sjdp bfd *abfd; 9533965Sjdp{ 9633965Sjdp enum bfd_architecture a = bfd_get_arch (abfd); 9733965Sjdp disassembler_ftype disassemble; 9833965Sjdp 9933965Sjdp switch (a) 10033965Sjdp { 10133965Sjdp /* If you add a case to this table, also add it to the 10233965Sjdp ARCH_all definition right above this function. */ 10333965Sjdp#ifdef ARCH_alpha 10433965Sjdp case bfd_arch_alpha: 10533965Sjdp disassemble = print_insn_alpha; 10633965Sjdp break; 10733965Sjdp#endif 10838889Sjdp#ifdef ARCH_arc 10938889Sjdp case bfd_arch_arc: 11038889Sjdp { 11177298Sobrien disassemble = arc_get_disassembler (abfd); 11238889Sjdp break; 11338889Sjdp } 11438889Sjdp#endif 11533965Sjdp#ifdef ARCH_arm 11633965Sjdp case bfd_arch_arm: 11733965Sjdp if (bfd_big_endian (abfd)) 11833965Sjdp disassemble = print_insn_big_arm; 11933965Sjdp else 12033965Sjdp disassemble = print_insn_little_arm; 12133965Sjdp break; 12233965Sjdp#endif 12360484Sobrien#ifdef ARCH_avr 12460484Sobrien case bfd_arch_avr: 12560484Sobrien disassemble = print_insn_avr; 12660484Sobrien break; 12760484Sobrien#endif 128218822Sdim#ifdef ARCH_bfin 129218822Sdim case bfd_arch_bfin: 130218822Sdim disassemble = print_insn_bfin; 131218822Sdim break; 132218822Sdim#endif 133218822Sdim#ifdef ARCH_cr16 134218822Sdim case bfd_arch_cr16: 135218822Sdim disassemble = print_insn_cr16; 136218822Sdim break; 137218822Sdim#endif 13877298Sobrien#ifdef ARCH_cris 13977298Sobrien case bfd_arch_cris: 14077298Sobrien disassemble = cris_get_disassembler (abfd); 14177298Sobrien break; 14277298Sobrien#endif 143218822Sdim#ifdef ARCH_crx 144218822Sdim case bfd_arch_crx: 145218822Sdim disassemble = print_insn_crx; 146218822Sdim break; 147218822Sdim#endif 14833965Sjdp#ifdef ARCH_d10v 14933965Sjdp case bfd_arch_d10v: 15033965Sjdp disassemble = print_insn_d10v; 15133965Sjdp break; 15233965Sjdp#endif 15360484Sobrien#ifdef ARCH_d30v 15460484Sobrien case bfd_arch_d30v: 15560484Sobrien disassemble = print_insn_d30v; 15660484Sobrien break; 15760484Sobrien#endif 158104834Sobrien#ifdef ARCH_dlx 159104834Sobrien case bfd_arch_dlx: 160104834Sobrien /* As far as I know we only handle big-endian DLX objects. */ 161104834Sobrien disassemble = print_insn_dlx; 162104834Sobrien break; 163104834Sobrien#endif 16433965Sjdp#ifdef ARCH_h8300 16533965Sjdp case bfd_arch_h8300: 166130561Sobrien if (bfd_get_mach (abfd) == bfd_mach_h8300h 167130561Sobrien || bfd_get_mach (abfd) == bfd_mach_h8300hn) 16833965Sjdp disassemble = print_insn_h8300h; 169130561Sobrien else if (bfd_get_mach (abfd) == bfd_mach_h8300s 170130561Sobrien || bfd_get_mach (abfd) == bfd_mach_h8300sn 171218822Sdim || bfd_get_mach (abfd) == bfd_mach_h8300sx 172218822Sdim || bfd_get_mach (abfd) == bfd_mach_h8300sxn) 17333965Sjdp disassemble = print_insn_h8300s; 17477298Sobrien else 17533965Sjdp disassemble = print_insn_h8300; 17633965Sjdp break; 17733965Sjdp#endif 17833965Sjdp#ifdef ARCH_h8500 17933965Sjdp case bfd_arch_h8500: 18033965Sjdp disassemble = print_insn_h8500; 18133965Sjdp break; 18233965Sjdp#endif 18333965Sjdp#ifdef ARCH_hppa 18433965Sjdp case bfd_arch_hppa: 18533965Sjdp disassemble = print_insn_hppa; 18633965Sjdp break; 18733965Sjdp#endif 18860484Sobrien#ifdef ARCH_i370 18960484Sobrien case bfd_arch_i370: 19060484Sobrien disassemble = print_insn_i370; 19160484Sobrien break; 19260484Sobrien#endif 19333965Sjdp#ifdef ARCH_i386 19433965Sjdp case bfd_arch_i386: 19589857Sobrien disassemble = print_insn_i386; 19633965Sjdp break; 19733965Sjdp#endif 19877298Sobrien#ifdef ARCH_i860 19977298Sobrien case bfd_arch_i860: 20077298Sobrien disassemble = print_insn_i860; 20177298Sobrien break; 20277298Sobrien#endif 20333965Sjdp#ifdef ARCH_i960 20433965Sjdp case bfd_arch_i960: 20533965Sjdp disassemble = print_insn_i960; 20633965Sjdp break; 20733965Sjdp#endif 20877298Sobrien#ifdef ARCH_ia64 20977298Sobrien case bfd_arch_ia64: 21077298Sobrien disassemble = print_insn_ia64; 21177298Sobrien break; 21277298Sobrien#endif 213130561Sobrien#ifdef ARCH_ip2k 214130561Sobrien case bfd_arch_ip2k: 215130561Sobrien disassemble = print_insn_ip2k; 216130561Sobrien break; 217130561Sobrien#endif 21860484Sobrien#ifdef ARCH_fr30 21960484Sobrien case bfd_arch_fr30: 22060484Sobrien disassemble = print_insn_fr30; 22160484Sobrien break; 22260484Sobrien#endif 22333965Sjdp#ifdef ARCH_m32r 22433965Sjdp case bfd_arch_m32r: 22533965Sjdp disassemble = print_insn_m32r; 22633965Sjdp break; 22733965Sjdp#endif 22877298Sobrien#if defined(ARCH_m68hc11) || defined(ARCH_m68hc12) 22977298Sobrien case bfd_arch_m68hc11: 23077298Sobrien disassemble = print_insn_m68hc11; 23177298Sobrien break; 23277298Sobrien case bfd_arch_m68hc12: 23377298Sobrien disassemble = print_insn_m68hc12; 23477298Sobrien break; 23577298Sobrien#endif 23633965Sjdp#ifdef ARCH_m68k 23733965Sjdp case bfd_arch_m68k: 23833965Sjdp disassemble = print_insn_m68k; 23933965Sjdp break; 24033965Sjdp#endif 24133965Sjdp#ifdef ARCH_m88k 24233965Sjdp case bfd_arch_m88k: 24333965Sjdp disassemble = print_insn_m88k; 24433965Sjdp break; 24533965Sjdp#endif 246218822Sdim#ifdef ARCH_maxq 247218822Sdim case bfd_arch_maxq: 248218822Sdim disassemble = print_insn_maxq_little; 249218822Sdim break; 250218822Sdim#endif 251218822Sdim#ifdef ARCH_mt 252218822Sdim case bfd_arch_mt: 253218822Sdim disassemble = print_insn_mt; 254218822Sdim break; 255218822Sdim#endif 256130561Sobrien#ifdef ARCH_msp430 257130561Sobrien case bfd_arch_msp430: 258130561Sobrien disassemble = print_insn_msp430; 259130561Sobrien break; 260130561Sobrien#endif 26133965Sjdp#ifdef ARCH_ns32k 26233965Sjdp case bfd_arch_ns32k: 26333965Sjdp disassemble = print_insn_ns32k; 26433965Sjdp break; 26533965Sjdp#endif 26660484Sobrien#ifdef ARCH_mcore 26760484Sobrien case bfd_arch_mcore: 26860484Sobrien disassemble = print_insn_mcore; 26960484Sobrien break; 27060484Sobrien#endif 271218822Sdim#ifdef ARCH_mep 272218822Sdim case bfd_arch_mep: 273218822Sdim disassemble = print_insn_mep; 274218822Sdim break; 275218822Sdim#endif 27633965Sjdp#ifdef ARCH_mips 27733965Sjdp case bfd_arch_mips: 27833965Sjdp if (bfd_big_endian (abfd)) 27933965Sjdp disassemble = print_insn_big_mips; 28033965Sjdp else 28133965Sjdp disassemble = print_insn_little_mips; 28233965Sjdp break; 28333965Sjdp#endif 28489857Sobrien#ifdef ARCH_mmix 28589857Sobrien case bfd_arch_mmix: 28689857Sobrien disassemble = print_insn_mmix; 28789857Sobrien break; 28889857Sobrien#endif 28933965Sjdp#ifdef ARCH_mn10200 29033965Sjdp case bfd_arch_mn10200: 29133965Sjdp disassemble = print_insn_mn10200; 29233965Sjdp break; 29333965Sjdp#endif 29433965Sjdp#ifdef ARCH_mn10300 29533965Sjdp case bfd_arch_mn10300: 29633965Sjdp disassemble = print_insn_mn10300; 29733965Sjdp break; 29833965Sjdp#endif 29989857Sobrien#ifdef ARCH_openrisc 30089857Sobrien case bfd_arch_openrisc: 30189857Sobrien disassemble = print_insn_openrisc; 30289857Sobrien break; 30389857Sobrien#endif 30491041Sobrien#ifdef ARCH_or32 30591041Sobrien case bfd_arch_or32: 30691041Sobrien if (bfd_big_endian (abfd)) 30791041Sobrien disassemble = print_insn_big_or32; 30891041Sobrien else 30991041Sobrien disassemble = print_insn_little_or32; 31091041Sobrien break; 31191041Sobrien#endif 31289857Sobrien#ifdef ARCH_pdp11 31389857Sobrien case bfd_arch_pdp11: 31489857Sobrien disassemble = print_insn_pdp11; 31589857Sobrien break; 31689857Sobrien#endif 31760484Sobrien#ifdef ARCH_pj 31860484Sobrien case bfd_arch_pj: 31960484Sobrien disassemble = print_insn_pj; 32060484Sobrien break; 32160484Sobrien#endif 32233965Sjdp#ifdef ARCH_powerpc 32333965Sjdp case bfd_arch_powerpc: 32433965Sjdp if (bfd_big_endian (abfd)) 32533965Sjdp disassemble = print_insn_big_powerpc; 32633965Sjdp else 32733965Sjdp disassemble = print_insn_little_powerpc; 32833965Sjdp break; 32933965Sjdp#endif 33033965Sjdp#ifdef ARCH_rs6000 33133965Sjdp case bfd_arch_rs6000: 33277298Sobrien if (bfd_get_mach (abfd) == bfd_mach_ppc_620) 33377298Sobrien disassemble = print_insn_big_powerpc; 33477298Sobrien else 33577298Sobrien disassemble = print_insn_rs6000; 33633965Sjdp break; 33733965Sjdp#endif 33889857Sobrien#ifdef ARCH_s390 33989857Sobrien case bfd_arch_s390: 34089857Sobrien disassemble = print_insn_s390; 34189857Sobrien break; 34289857Sobrien#endif 343218822Sdim#ifdef ARCH_score 344218822Sdim case bfd_arch_score: 345218822Sdim if (bfd_big_endian (abfd)) 346218822Sdim disassemble = print_insn_big_score; 347218822Sdim else 348218822Sdim disassemble = print_insn_little_score; 349218822Sdim break; 350218822Sdim#endif 35133965Sjdp#ifdef ARCH_sh 35233965Sjdp case bfd_arch_sh: 353104834Sobrien disassemble = print_insn_sh; 35433965Sjdp break; 35533965Sjdp#endif 35633965Sjdp#ifdef ARCH_sparc 35733965Sjdp case bfd_arch_sparc: 35833965Sjdp disassemble = print_insn_sparc; 35933965Sjdp break; 36033965Sjdp#endif 361218822Sdim#ifdef ARCH_spu 362218822Sdim case bfd_arch_spu: 363218822Sdim disassemble = print_insn_spu; 364218822Sdim break; 365218822Sdim#endif 36638889Sjdp#ifdef ARCH_tic30 36738889Sjdp case bfd_arch_tic30: 36838889Sjdp disassemble = print_insn_tic30; 36938889Sjdp break; 37038889Sjdp#endif 371130561Sobrien#ifdef ARCH_tic4x 372130561Sobrien case bfd_arch_tic4x: 373130561Sobrien disassemble = print_insn_tic4x; 374130561Sobrien break; 375130561Sobrien#endif 37677298Sobrien#ifdef ARCH_tic54x 37777298Sobrien case bfd_arch_tic54x: 37877298Sobrien disassemble = print_insn_tic54x; 37977298Sobrien break; 38077298Sobrien#endif 38160484Sobrien#ifdef ARCH_tic80 38260484Sobrien case bfd_arch_tic80: 38360484Sobrien disassemble = print_insn_tic80; 38460484Sobrien break; 38560484Sobrien#endif 38638889Sjdp#ifdef ARCH_v850 38738889Sjdp case bfd_arch_v850: 38838889Sjdp disassemble = print_insn_v850; 38938889Sjdp break; 39038889Sjdp#endif 39133965Sjdp#ifdef ARCH_w65 39233965Sjdp case bfd_arch_w65: 39333965Sjdp disassemble = print_insn_w65; 39433965Sjdp break; 39533965Sjdp#endif 39689857Sobrien#ifdef ARCH_xstormy16 39789857Sobrien case bfd_arch_xstormy16: 39889857Sobrien disassemble = print_insn_xstormy16; 39989857Sobrien break; 40089857Sobrien#endif 401218822Sdim#ifdef ARCH_xc16x 402218822Sdim case bfd_arch_xc16x: 403218822Sdim disassemble = print_insn_xc16x; 404218822Sdim break; 405218822Sdim#endif 406130561Sobrien#ifdef ARCH_xtensa 407130561Sobrien case bfd_arch_xtensa: 408130561Sobrien disassemble = print_insn_xtensa; 409130561Sobrien break; 410130561Sobrien#endif 411218822Sdim#ifdef ARCH_z80 412218822Sdim case bfd_arch_z80: 413218822Sdim disassemble = print_insn_z80; 414218822Sdim break; 415218822Sdim#endif 41633965Sjdp#ifdef ARCH_z8k 41733965Sjdp case bfd_arch_z8k: 41833965Sjdp if (bfd_get_mach(abfd) == bfd_mach_z8001) 41933965Sjdp disassemble = print_insn_z8001; 42077298Sobrien else 42133965Sjdp disassemble = print_insn_z8002; 42233965Sjdp break; 42333965Sjdp#endif 42460484Sobrien#ifdef ARCH_vax 42560484Sobrien case bfd_arch_vax: 42660484Sobrien disassemble = print_insn_vax; 42760484Sobrien break; 42860484Sobrien#endif 429104834Sobrien#ifdef ARCH_frv 430104834Sobrien case bfd_arch_frv: 431104834Sobrien disassemble = print_insn_frv; 432104834Sobrien break; 433104834Sobrien#endif 434130561Sobrien#ifdef ARCH_iq2000 435130561Sobrien case bfd_arch_iq2000: 436130561Sobrien disassemble = print_insn_iq2000; 437130561Sobrien break; 438130561Sobrien#endif 439218822Sdim#ifdef ARCH_m32c 440218822Sdim case bfd_arch_m32c: 441218822Sdim disassemble = print_insn_m32c; 442218822Sdim break; 443218822Sdim#endif 44433965Sjdp default: 44533965Sjdp return 0; 44633965Sjdp } 44733965Sjdp return disassemble; 44833965Sjdp} 44938889Sjdp 45060484Sobrienvoid 45160484Sobriendisassembler_usage (stream) 45277298Sobrien FILE * stream ATTRIBUTE_UNUSED; 45360484Sobrien{ 45460484Sobrien#ifdef ARCH_arm 45560484Sobrien print_arm_disassembler_options (stream); 45660484Sobrien#endif 457130561Sobrien#ifdef ARCH_mips 458130561Sobrien print_mips_disassembler_options (stream); 459130561Sobrien#endif 460104834Sobrien#ifdef ARCH_powerpc 461104834Sobrien print_ppc_disassembler_options (stream); 462104834Sobrien#endif 463218822Sdim#ifdef ARCH_i386 464218822Sdim print_i386_disassembler_options (stream); 465218822Sdim#endif 46677298Sobrien 46760484Sobrien return; 46860484Sobrien} 469130561Sobrien 470130561Sobrienvoid 471130561Sobriendisassemble_init_for_target (struct disassemble_info * info) 472130561Sobrien{ 473130561Sobrien if (info == NULL) 474130561Sobrien return; 475130561Sobrien 476130561Sobrien switch (info->arch) 477130561Sobrien { 478130561Sobrien#ifdef ARCH_arm 479130561Sobrien case bfd_arch_arm: 480130561Sobrien info->symbol_is_valid = arm_symbol_is_valid; 481218822Sdim info->disassembler_needs_relocs = TRUE; 482130561Sobrien break; 483130561Sobrien#endif 484218822Sdim#ifdef ARCH_ia64 485218822Sdim case bfd_arch_ia64: 486218822Sdim info->skip_zeroes = 16; 487218822Sdim break; 488218822Sdim#endif 489218822Sdim#ifdef ARCH_tic4x 490218822Sdim case bfd_arch_tic4x: 491218822Sdim info->skip_zeroes = 32; 492218822Sdim break; 493218822Sdim#endif 494218822Sdim#ifdef ARCH_mep 495218822Sdim case bfd_arch_mep: 496218822Sdim info->skip_zeroes = 256; 497218822Sdim info->skip_zeroes_at_end = 0; 498218822Sdim break; 499218822Sdim#endif 500218822Sdim#ifdef ARCH_m32c 501218822Sdim case bfd_arch_m32c: 502218822Sdim info->endian = BFD_ENDIAN_BIG; 503218822Sdim if (! info->insn_sets) 504218822Sdim { 505218822Sdim info->insn_sets = cgen_bitset_create (ISA_MAX); 506218822Sdim if (info->mach == bfd_mach_m16c) 507218822Sdim cgen_bitset_set (info->insn_sets, ISA_M16C); 508218822Sdim else 509218822Sdim cgen_bitset_set (info->insn_sets, ISA_M32C); 510218822Sdim } 511218822Sdim break; 512218822Sdim#endif 513130561Sobrien default: 514130561Sobrien break; 515130561Sobrien } 516130561Sobrien} 517