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