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