1/* Select disassembly routine for specified architecture.
2   Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
3   2004, 2005 Free Software Foundation, Inc.
4
5   This program is free software; you can redistribute it and/or modify
6   it under the terms of the GNU General Public License as published by
7   the Free Software Foundation; either version 2 of the License, or
8   (at your option) any later version.
9
10   This program is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU General Public License for more details.
14
15   You should have received a copy of the GNU General Public License
16   along with this program; if not, write to the Free Software
17   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
18
19#include "sysdep.h"
20#include "dis-asm.h"
21
22#ifdef ARCH_all
23#define ARCH_alpha
24#define ARCH_arc
25#define ARCH_arm
26#define ARCH_avr
27#define ARCH_bfin
28#define ARCH_cris
29#define ARCH_crx
30#define ARCH_d10v
31#define ARCH_d30v
32#define ARCH_dlx
33#define ARCH_fr30
34#define ARCH_frv
35#define ARCH_h8300
36#define ARCH_h8500
37#define ARCH_hppa
38#define ARCH_i370
39#define ARCH_i386
40#define ARCH_i860
41#define ARCH_i960
42#define ARCH_ia64
43#define ARCH_ip2k
44#define ARCH_iq2000
45#define ARCH_m32c
46#define ARCH_m32r
47#define ARCH_m68hc11
48#define ARCH_m68hc12
49#define ARCH_m68k
50#define ARCH_m88k
51#define ARCH_maxq
52#define ARCH_mcore
53#define ARCH_mips
54#define ARCH_mmix
55#define ARCH_mn10200
56#define ARCH_mn10300
57#define ARCH_mt
58#define ARCH_msp430
59#define ARCH_ns32k
60#define ARCH_openrisc
61#define ARCH_or32
62#define ARCH_pdp11
63#define ARCH_pj
64#define ARCH_powerpc
65#define ARCH_rs6000
66#define ARCH_s390
67#define ARCH_sh
68#define ARCH_sparc
69#define ARCH_tic30
70#define ARCH_tic4x
71#define ARCH_tic54x
72#define ARCH_tic80
73#define ARCH_v850
74#define ARCH_vax
75#define ARCH_w65
76#define ARCH_xstormy16
77#define ARCH_xc16x
78#define ARCH_xtensa
79#define ARCH_z80
80#define ARCH_z8k
81#define INCLUDE_SHMEDIA
82#endif
83
84#ifdef ARCH_m32c
85#include "m32c-desc.h"
86#endif
87
88disassembler_ftype
89disassembler (abfd)
90     bfd *abfd;
91{
92  enum bfd_architecture a = bfd_get_arch (abfd);
93  disassembler_ftype disassemble;
94
95  switch (a)
96    {
97      /* If you add a case to this table, also add it to the
98	 ARCH_all definition right above this function.  */
99#ifdef ARCH_alpha
100    case bfd_arch_alpha:
101      disassemble = print_insn_alpha;
102      break;
103#endif
104#ifdef ARCH_arc
105    case bfd_arch_arc:
106      {
107	disassemble = arc_get_disassembler (abfd);
108	break;
109      }
110#endif
111#ifdef ARCH_arm
112    case bfd_arch_arm:
113      if (bfd_big_endian (abfd))
114	disassemble = print_insn_big_arm;
115      else
116	disassemble = print_insn_little_arm;
117      break;
118#endif
119#ifdef ARCH_avr
120    case bfd_arch_avr:
121      disassemble = print_insn_avr;
122      break;
123#endif
124#ifdef ARCH_bfin
125    case bfd_arch_bfin:
126      disassemble = print_insn_bfin;
127      break;
128#endif
129#ifdef ARCH_cris
130    case bfd_arch_cris:
131      disassemble = cris_get_disassembler (abfd);
132      break;
133#endif
134#ifdef ARCH_crx
135    case bfd_arch_crx:
136      disassemble = print_insn_crx;
137      break;
138#endif
139#ifdef ARCH_d10v
140    case bfd_arch_d10v:
141      disassemble = print_insn_d10v;
142      break;
143#endif
144#ifdef ARCH_d30v
145    case bfd_arch_d30v:
146      disassemble = print_insn_d30v;
147      break;
148#endif
149#ifdef ARCH_dlx
150    case bfd_arch_dlx:
151      /* As far as I know we only handle big-endian DLX objects.  */
152      disassemble = print_insn_dlx;
153      break;
154#endif
155#ifdef ARCH_h8300
156    case bfd_arch_h8300:
157      if (bfd_get_mach (abfd) == bfd_mach_h8300h
158	  || bfd_get_mach (abfd) == bfd_mach_h8300hn)
159	disassemble = print_insn_h8300h;
160      else if (bfd_get_mach (abfd) == bfd_mach_h8300s
161	       || bfd_get_mach (abfd) == bfd_mach_h8300sn
162	       || bfd_get_mach (abfd) == bfd_mach_h8300sx
163	       || bfd_get_mach (abfd) == bfd_mach_h8300sxn)
164	disassemble = print_insn_h8300s;
165      else
166	disassemble = print_insn_h8300;
167      break;
168#endif
169#ifdef ARCH_h8500
170    case bfd_arch_h8500:
171      disassemble = print_insn_h8500;
172      break;
173#endif
174#ifdef ARCH_hppa
175    case bfd_arch_hppa:
176      disassemble = print_insn_hppa;
177      break;
178#endif
179#ifdef ARCH_i370
180    case bfd_arch_i370:
181      disassemble = print_insn_i370;
182      break;
183#endif
184#ifdef ARCH_i386
185    case bfd_arch_i386:
186      disassemble = print_insn_i386;
187      break;
188#endif
189#ifdef ARCH_i860
190    case bfd_arch_i860:
191      disassemble = print_insn_i860;
192      break;
193#endif
194#ifdef ARCH_i960
195    case bfd_arch_i960:
196      disassemble = print_insn_i960;
197      break;
198#endif
199#ifdef ARCH_ia64
200    case bfd_arch_ia64:
201      disassemble = print_insn_ia64;
202      break;
203#endif
204#ifdef ARCH_ip2k
205    case bfd_arch_ip2k:
206      disassemble = print_insn_ip2k;
207      break;
208#endif
209#ifdef ARCH_fr30
210    case bfd_arch_fr30:
211      disassemble = print_insn_fr30;
212      break;
213#endif
214#ifdef ARCH_m32r
215    case bfd_arch_m32r:
216      disassemble = print_insn_m32r;
217      break;
218#endif
219#if defined(ARCH_m68hc11) || defined(ARCH_m68hc12)
220    case bfd_arch_m68hc11:
221      disassemble = print_insn_m68hc11;
222      break;
223    case bfd_arch_m68hc12:
224      disassemble = print_insn_m68hc12;
225      break;
226#endif
227#ifdef ARCH_m68k
228    case bfd_arch_m68k:
229      disassemble = print_insn_m68k;
230      break;
231#endif
232#ifdef ARCH_m88k
233    case bfd_arch_m88k:
234      disassemble = print_insn_m88k;
235      break;
236#endif
237#ifdef ARCH_maxq
238    case bfd_arch_maxq:
239      disassemble = print_insn_maxq_little;
240      break;
241#endif
242#ifdef ARCH_mt
243    case bfd_arch_mt:
244      disassemble = print_insn_mt;
245      break;
246#endif
247#ifdef ARCH_msp430
248    case bfd_arch_msp430:
249      disassemble = print_insn_msp430;
250      break;
251#endif
252#ifdef ARCH_ns32k
253    case bfd_arch_ns32k:
254      disassemble = print_insn_ns32k;
255      break;
256#endif
257#ifdef ARCH_mcore
258    case bfd_arch_mcore:
259      disassemble = print_insn_mcore;
260      break;
261#endif
262#ifdef ARCH_mips
263    case bfd_arch_mips:
264      if (bfd_big_endian (abfd))
265	disassemble = print_insn_big_mips;
266      else
267	disassemble = print_insn_little_mips;
268      break;
269#endif
270#ifdef ARCH_mmix
271    case bfd_arch_mmix:
272      disassemble = print_insn_mmix;
273      break;
274#endif
275#ifdef ARCH_mn10200
276    case bfd_arch_mn10200:
277      disassemble = print_insn_mn10200;
278      break;
279#endif
280#ifdef ARCH_mn10300
281    case bfd_arch_mn10300:
282      disassemble = print_insn_mn10300;
283      break;
284#endif
285#ifdef ARCH_openrisc
286    case bfd_arch_openrisc:
287      disassemble = print_insn_openrisc;
288      break;
289#endif
290#ifdef ARCH_or32
291    case bfd_arch_or32:
292      if (bfd_big_endian (abfd))
293        disassemble = print_insn_big_or32;
294      else
295        disassemble = print_insn_little_or32;
296      break;
297#endif
298#ifdef ARCH_pdp11
299    case bfd_arch_pdp11:
300      disassemble = print_insn_pdp11;
301      break;
302#endif
303#ifdef ARCH_pj
304    case bfd_arch_pj:
305      disassemble = print_insn_pj;
306      break;
307#endif
308#ifdef ARCH_powerpc
309    case bfd_arch_powerpc:
310      if (bfd_big_endian (abfd))
311	disassemble = print_insn_big_powerpc;
312      else
313	disassemble = print_insn_little_powerpc;
314      break;
315#endif
316#ifdef ARCH_rs6000
317    case bfd_arch_rs6000:
318      if (bfd_get_mach (abfd) == bfd_mach_ppc_620)
319	disassemble = print_insn_big_powerpc;
320      else
321	disassemble = print_insn_rs6000;
322      break;
323#endif
324#ifdef ARCH_s390
325    case bfd_arch_s390:
326      disassemble = print_insn_s390;
327      break;
328#endif
329#ifdef ARCH_sh
330    case bfd_arch_sh:
331      disassemble = print_insn_sh;
332      break;
333#endif
334#ifdef ARCH_sparc
335    case bfd_arch_sparc:
336      disassemble = print_insn_sparc;
337      break;
338#endif
339#ifdef ARCH_tic30
340    case bfd_arch_tic30:
341      disassemble = print_insn_tic30;
342      break;
343#endif
344#ifdef ARCH_tic4x
345    case bfd_arch_tic4x:
346      disassemble = print_insn_tic4x;
347      break;
348#endif
349#ifdef ARCH_tic54x
350    case bfd_arch_tic54x:
351      disassemble = print_insn_tic54x;
352      break;
353#endif
354#ifdef ARCH_tic80
355    case bfd_arch_tic80:
356      disassemble = print_insn_tic80;
357      break;
358#endif
359#ifdef ARCH_v850
360    case bfd_arch_v850:
361      disassemble = print_insn_v850;
362      break;
363#endif
364#ifdef ARCH_w65
365    case bfd_arch_w65:
366      disassemble = print_insn_w65;
367      break;
368#endif
369#ifdef ARCH_xstormy16
370    case bfd_arch_xstormy16:
371      disassemble = print_insn_xstormy16;
372      break;
373#endif
374#ifdef ARCH_xc16x
375    case bfd_arch_xc16x:
376      disassemble = print_insn_xc16x;
377      break;
378#endif
379#ifdef ARCH_xtensa
380    case bfd_arch_xtensa:
381      disassemble = print_insn_xtensa;
382      break;
383#endif
384#ifdef ARCH_z80
385    case bfd_arch_z80:
386      disassemble = print_insn_z80;
387      break;
388#endif
389#ifdef ARCH_z8k
390    case bfd_arch_z8k:
391      if (bfd_get_mach(abfd) == bfd_mach_z8001)
392	disassemble = print_insn_z8001;
393      else
394	disassemble = print_insn_z8002;
395      break;
396#endif
397#ifdef ARCH_vax
398    case bfd_arch_vax:
399      disassemble = print_insn_vax;
400      break;
401#endif
402#ifdef ARCH_frv
403    case bfd_arch_frv:
404      disassemble = print_insn_frv;
405      break;
406#endif
407#ifdef ARCH_iq2000
408    case bfd_arch_iq2000:
409      disassemble = print_insn_iq2000;
410      break;
411#endif
412#ifdef ARCH_m32c
413    case bfd_arch_m32c:
414      disassemble = print_insn_m32c;
415      break;
416#endif
417    default:
418      return 0;
419    }
420  return disassemble;
421}
422
423void
424disassembler_usage (stream)
425     FILE * stream ATTRIBUTE_UNUSED;
426{
427#ifdef ARCH_arm
428  print_arm_disassembler_options (stream);
429#endif
430#ifdef ARCH_mips
431  print_mips_disassembler_options (stream);
432#endif
433#ifdef ARCH_powerpc
434  print_ppc_disassembler_options (stream);
435#endif
436
437  return;
438}
439
440void
441disassemble_init_for_target (struct disassemble_info * info)
442{
443  if (info == NULL)
444    return;
445
446  switch (info->arch)
447    {
448#ifdef ARCH_arm
449    case bfd_arch_arm:
450      info->symbol_is_valid = arm_symbol_is_valid;
451      info->disassembler_needs_relocs = TRUE;
452      break;
453#endif
454#ifdef ARCH_ia64
455    case bfd_arch_ia64:
456      info->skip_zeroes = 16;
457      break;
458#endif
459#ifdef ARCH_tic4x
460    case bfd_arch_tic4x:
461      info->skip_zeroes = 32;
462      break;
463#endif
464#ifdef ARCH_m32c
465    case bfd_arch_m32c:
466      info->endian = BFD_ENDIAN_BIG;
467      if (! info->insn_sets)
468	{
469	  info->insn_sets = cgen_bitset_create (ISA_MAX);
470	  if (info->mach == bfd_mach_m16c)
471	    cgen_bitset_set (info->insn_sets, ISA_M16C);
472	  else
473	    cgen_bitset_set (info->insn_sets, ISA_M32C);
474	}
475      break;
476#endif
477    default:
478      break;
479    }
480}
481