Subversion Repositories Kolibri OS

Rev

Rev 5221 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5221 serge 1
/* Select disassembly routine for specified architecture.
6324 serge 2
   Copyright (C) 1994-2015 Free Software Foundation, Inc.
5221 serge 3
 
4
   This file is part of the GNU opcodes library.
5
 
6
   This library is free software; you can redistribute it and/or modify
7
   it under the terms of the GNU General Public License as published by
8
   the Free Software Foundation; either version 3 of the License, or
9
   (at your option) any later version.
10
 
11
   This program is distributed in the hope that it will be useful,
12
   but WITHOUT ANY WARRANTY; without even the implied warranty of
13
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
   GNU General Public License for more details.
15
 
16
   You should have received a copy of the GNU General Public License
17
   along with this program; if not, write to the Free Software
18
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19
   MA 02110-1301, USA.  */
20
 
21
#include "sysdep.h"
22
#include "dis-asm.h"
23
 
24
#ifdef ARCH_all
25
#define ARCH_aarch64
26
#define ARCH_alpha
27
#define ARCH_arc
28
#define ARCH_arm
29
#define ARCH_avr
30
#define ARCH_bfin
31
#define ARCH_cr16
32
#define ARCH_cris
33
#define ARCH_crx
34
#define ARCH_d10v
35
#define ARCH_d30v
36
#define ARCH_dlx
37
#define ARCH_epiphany
38
#define ARCH_fr30
39
#define ARCH_frv
6324 serge 40
#define ARCH_ft32
5221 serge 41
#define ARCH_h8300
42
#define ARCH_h8500
43
#define ARCH_hppa
44
#define ARCH_i370
45
#define ARCH_i386
46
#define ARCH_i860
47
#define ARCH_i960
48
#define ARCH_ia64
49
#define ARCH_ip2k
50
#define ARCH_iq2000
51
#define ARCH_lm32
52
#define ARCH_m32c
53
#define ARCH_m32r
54
#define ARCH_m68hc11
55
#define ARCH_m68hc12
56
#define ARCH_m68k
57
#define ARCH_m88k
58
#define ARCH_mcore
59
#define ARCH_mep
60
#define ARCH_metag
61
#define ARCH_microblaze
62
#define ARCH_mips
63
#define ARCH_mmix
64
#define ARCH_mn10200
65
#define ARCH_mn10300
66
#define ARCH_moxie
67
#define ARCH_mt
68
#define ARCH_msp430
6324 serge 69
#define ARCH_nds32
5221 serge 70
#define ARCH_nios2
71
#define ARCH_ns32k
6324 serge 72
#define ARCH_or1k
5221 serge 73
#define ARCH_pdp11
74
#define ARCH_pj
75
#define ARCH_powerpc
76
#define ARCH_rs6000
77
#define ARCH_rl78
78
#define ARCH_rx
79
#define ARCH_s390
80
#define ARCH_score
81
#define ARCH_sh
82
#define ARCH_sparc
83
#define ARCH_spu
84
#define ARCH_tic30
85
#define ARCH_tic4x
86
#define ARCH_tic54x
87
#define ARCH_tic6x
88
#define ARCH_tic80
89
#define ARCH_tilegx
90
#define ARCH_tilepro
91
#define ARCH_v850
92
#define ARCH_vax
6324 serge 93
#define ARCH_visium
5221 serge 94
#define ARCH_w65
95
#define ARCH_xstormy16
96
#define ARCH_xc16x
97
#define ARCH_xgate
98
#define ARCH_xtensa
99
#define ARCH_z80
100
#define ARCH_z8k
101
#define INCLUDE_SHMEDIA
102
#endif
103
 
104
#ifdef ARCH_m32c
105
#include "m32c-desc.h"
106
#endif
107
 
108
disassembler_ftype
109
disassembler (abfd)
110
     bfd *abfd;
111
{
112
  enum bfd_architecture a = bfd_get_arch (abfd);
113
  disassembler_ftype disassemble;
114
 
115
  switch (a)
116
    {
117
      /* If you add a case to this table, also add it to the
118
	 ARCH_all definition right above this function.  */
119
#ifdef ARCH_aarch64
120
    case bfd_arch_aarch64:
121
      disassemble = print_insn_aarch64;
122
      break;
123
#endif
124
#ifdef ARCH_alpha
125
    case bfd_arch_alpha:
126
      disassemble = print_insn_alpha;
127
      break;
128
#endif
129
#ifdef ARCH_arc
130
    case bfd_arch_arc:
131
      disassemble = arc_get_disassembler (abfd);
132
      break;
133
#endif
134
#ifdef ARCH_arm
135
    case bfd_arch_arm:
136
      if (bfd_big_endian (abfd))
137
	disassemble = print_insn_big_arm;
138
      else
139
	disassemble = print_insn_little_arm;
140
      break;
141
#endif
142
#ifdef ARCH_avr
143
    case bfd_arch_avr:
144
      disassemble = print_insn_avr;
145
      break;
146
#endif
147
#ifdef ARCH_bfin
148
    case bfd_arch_bfin:
149
      disassemble = print_insn_bfin;
150
      break;
151
#endif
152
#ifdef ARCH_cr16
153
    case bfd_arch_cr16:
154
      disassemble = print_insn_cr16;
155
      break;
156
#endif
157
#ifdef ARCH_cris
158
    case bfd_arch_cris:
159
      disassemble = cris_get_disassembler (abfd);
160
      break;
161
#endif
162
#ifdef ARCH_crx
163
    case bfd_arch_crx:
164
      disassemble = print_insn_crx;
165
      break;
166
#endif
167
#ifdef ARCH_d10v
168
    case bfd_arch_d10v:
169
      disassemble = print_insn_d10v;
170
      break;
171
#endif
172
#ifdef ARCH_d30v
173
    case bfd_arch_d30v:
174
      disassemble = print_insn_d30v;
175
      break;
176
#endif
177
#ifdef ARCH_dlx
178
    case bfd_arch_dlx:
179
      /* As far as I know we only handle big-endian DLX objects.  */
180
      disassemble = print_insn_dlx;
181
      break;
182
#endif
183
#ifdef ARCH_h8300
184
    case bfd_arch_h8300:
185
      if (bfd_get_mach (abfd) == bfd_mach_h8300h
186
	  || bfd_get_mach (abfd) == bfd_mach_h8300hn)
187
	disassemble = print_insn_h8300h;
188
      else if (bfd_get_mach (abfd) == bfd_mach_h8300s
189
	       || bfd_get_mach (abfd) == bfd_mach_h8300sn
190
	       || bfd_get_mach (abfd) == bfd_mach_h8300sx
191
	       || bfd_get_mach (abfd) == bfd_mach_h8300sxn)
192
	disassemble = print_insn_h8300s;
193
      else
194
	disassemble = print_insn_h8300;
195
      break;
196
#endif
197
#ifdef ARCH_h8500
198
    case bfd_arch_h8500:
199
      disassemble = print_insn_h8500;
200
      break;
201
#endif
202
#ifdef ARCH_hppa
203
    case bfd_arch_hppa:
204
      disassemble = print_insn_hppa;
205
      break;
206
#endif
207
#ifdef ARCH_i370
208
    case bfd_arch_i370:
209
      disassemble = print_insn_i370;
210
      break;
211
#endif
212
#ifdef ARCH_i386
213
    case bfd_arch_i386:
6324 serge 214
    case bfd_arch_iamcu:
5221 serge 215
    case bfd_arch_l1om:
216
    case bfd_arch_k1om:
217
      disassemble = print_insn_i386;
218
      break;
219
#endif
220
#ifdef ARCH_i860
221
    case bfd_arch_i860:
222
      disassemble = print_insn_i860;
223
      break;
224
#endif
225
#ifdef ARCH_i960
226
    case bfd_arch_i960:
227
      disassemble = print_insn_i960;
228
      break;
229
#endif
230
#ifdef ARCH_ia64
231
    case bfd_arch_ia64:
232
      disassemble = print_insn_ia64;
233
      break;
234
#endif
235
#ifdef ARCH_ip2k
236
    case bfd_arch_ip2k:
237
      disassemble = print_insn_ip2k;
238
      break;
239
#endif
240
#ifdef ARCH_epiphany
241
    case bfd_arch_epiphany:
242
      disassemble = print_insn_epiphany;
243
      break;
244
#endif
245
#ifdef ARCH_fr30
246
    case bfd_arch_fr30:
247
      disassemble = print_insn_fr30;
248
      break;
249
#endif
250
#ifdef ARCH_lm32
251
    case bfd_arch_lm32:
252
      disassemble = print_insn_lm32;
253
      break;
254
#endif
255
#ifdef ARCH_m32r
256
    case bfd_arch_m32r:
257
      disassemble = print_insn_m32r;
258
      break;
259
#endif
260
#if defined(ARCH_m68hc11) || defined(ARCH_m68hc12) \
261
    || defined(ARCH_9s12x) || defined(ARCH_m9s12xg)
262
    case bfd_arch_m68hc11:
263
      disassemble = print_insn_m68hc11;
264
      break;
265
    case bfd_arch_m68hc12:
266
      disassemble = print_insn_m68hc12;
267
      break;
268
    case bfd_arch_m9s12x:
269
      disassemble = print_insn_m9s12x;
270
      break;
271
    case bfd_arch_m9s12xg:
272
      disassemble = print_insn_m9s12xg;
273
      break;
274
#endif
275
#ifdef ARCH_m68k
276
    case bfd_arch_m68k:
277
      disassemble = print_insn_m68k;
278
      break;
279
#endif
280
#ifdef ARCH_m88k
281
    case bfd_arch_m88k:
282
      disassemble = print_insn_m88k;
283
      break;
284
#endif
285
#ifdef ARCH_mt
286
    case bfd_arch_mt:
287
      disassemble = print_insn_mt;
288
      break;
289
#endif
290
#ifdef ARCH_microblaze
291
    case bfd_arch_microblaze:
292
      disassemble = print_insn_microblaze;
293
      break;
294
#endif
295
#ifdef ARCH_msp430
296
    case bfd_arch_msp430:
297
      disassemble = print_insn_msp430;
298
      break;
299
#endif
6324 serge 300
#ifdef ARCH_nds32
301
    case bfd_arch_nds32:
302
      disassemble = print_insn_nds32;
303
      break;
304
#endif
5221 serge 305
#ifdef ARCH_ns32k
306
    case bfd_arch_ns32k:
307
      disassemble = print_insn_ns32k;
308
      break;
309
#endif
310
#ifdef ARCH_mcore
311
    case bfd_arch_mcore:
312
      disassemble = print_insn_mcore;
313
      break;
314
#endif
315
#ifdef ARCH_mep
316
    case bfd_arch_mep:
317
      disassemble = print_insn_mep;
318
      break;
319
#endif
320
#ifdef ARCH_metag
321
    case bfd_arch_metag:
322
      disassemble = print_insn_metag;
323
      break;
324
#endif
325
#ifdef ARCH_mips
326
    case bfd_arch_mips:
327
      if (bfd_big_endian (abfd))
328
	disassemble = print_insn_big_mips;
329
      else
330
	disassemble = print_insn_little_mips;
331
      break;
332
#endif
333
#ifdef ARCH_mmix
334
    case bfd_arch_mmix:
335
      disassemble = print_insn_mmix;
336
      break;
337
#endif
338
#ifdef ARCH_mn10200
339
    case bfd_arch_mn10200:
340
      disassemble = print_insn_mn10200;
341
      break;
342
#endif
343
#ifdef ARCH_mn10300
344
    case bfd_arch_mn10300:
345
      disassemble = print_insn_mn10300;
346
      break;
347
#endif
348
#ifdef ARCH_nios2
349
    case bfd_arch_nios2:
350
      if (bfd_big_endian (abfd))
351
	disassemble = print_insn_big_nios2;
352
      else
353
	disassemble = print_insn_little_nios2;
354
      break;
355
#endif
6324 serge 356
#ifdef ARCH_or1k
357
    case bfd_arch_or1k:
358
      disassemble = print_insn_or1k;
5221 serge 359
      break;
360
#endif
361
#ifdef ARCH_pdp11
362
    case bfd_arch_pdp11:
363
      disassemble = print_insn_pdp11;
364
      break;
365
#endif
366
#ifdef ARCH_pj
367
    case bfd_arch_pj:
368
      disassemble = print_insn_pj;
369
      break;
370
#endif
371
#ifdef ARCH_powerpc
372
    case bfd_arch_powerpc:
373
      if (bfd_big_endian (abfd))
374
	disassemble = print_insn_big_powerpc;
375
      else
376
	disassemble = print_insn_little_powerpc;
377
      break;
378
#endif
379
#ifdef ARCH_rs6000
380
    case bfd_arch_rs6000:
381
      if (bfd_get_mach (abfd) == bfd_mach_ppc_620)
382
	disassemble = print_insn_big_powerpc;
383
      else
384
	disassemble = print_insn_rs6000;
385
      break;
386
#endif
387
#ifdef ARCH_rl78
388
    case bfd_arch_rl78:
6324 serge 389
      disassemble = rl78_get_disassembler (abfd);
5221 serge 390
      break;
391
#endif
392
#ifdef ARCH_rx
393
    case bfd_arch_rx:
394
      disassemble = print_insn_rx;
395
      break;
396
#endif
397
#ifdef ARCH_s390
398
    case bfd_arch_s390:
399
      disassemble = print_insn_s390;
400
      break;
401
#endif
402
#ifdef ARCH_score
403
    case bfd_arch_score:
404
      if (bfd_big_endian (abfd))
405
	disassemble = print_insn_big_score;
406
      else
407
	disassemble = print_insn_little_score;
408
     break;
409
#endif
410
#ifdef ARCH_sh
411
    case bfd_arch_sh:
412
      disassemble = print_insn_sh;
413
      break;
414
#endif
415
#ifdef ARCH_sparc
416
    case bfd_arch_sparc:
417
      disassemble = print_insn_sparc;
418
      break;
419
#endif
420
#ifdef ARCH_spu
421
    case bfd_arch_spu:
422
      disassemble = print_insn_spu;
423
      break;
424
#endif
425
#ifdef ARCH_tic30
426
    case bfd_arch_tic30:
427
      disassemble = print_insn_tic30;
428
      break;
429
#endif
430
#ifdef ARCH_tic4x
431
    case bfd_arch_tic4x:
432
      disassemble = print_insn_tic4x;
433
      break;
434
#endif
435
#ifdef ARCH_tic54x
436
    case bfd_arch_tic54x:
437
      disassemble = print_insn_tic54x;
438
      break;
439
#endif
440
#ifdef ARCH_tic6x
441
    case bfd_arch_tic6x:
442
      disassemble = print_insn_tic6x;
443
      break;
444
#endif
445
#ifdef ARCH_tic80
446
    case bfd_arch_tic80:
447
      disassemble = print_insn_tic80;
448
      break;
449
#endif
6324 serge 450
#ifdef ARCH_ft32
451
    case bfd_arch_ft32:
452
      disassemble = print_insn_ft32;
453
      break;
454
#endif
5221 serge 455
#ifdef ARCH_v850
456
    case bfd_arch_v850:
457
    case bfd_arch_v850_rh850:
458
      disassemble = print_insn_v850;
459
      break;
460
#endif
461
#ifdef ARCH_w65
462
    case bfd_arch_w65:
463
      disassemble = print_insn_w65;
464
      break;
465
#endif
466
#ifdef ARCH_xgate
467
    case bfd_arch_xgate:
468
      disassemble = print_insn_xgate;
469
      break;
470
#endif
471
#ifdef ARCH_xstormy16
472
    case bfd_arch_xstormy16:
473
      disassemble = print_insn_xstormy16;
474
      break;
475
#endif
476
#ifdef ARCH_xc16x
477
    case bfd_arch_xc16x:
478
      disassemble = print_insn_xc16x;
479
      break;
480
#endif
481
#ifdef ARCH_xtensa
482
    case bfd_arch_xtensa:
483
      disassemble = print_insn_xtensa;
484
      break;
485
#endif
486
#ifdef ARCH_z80
487
    case bfd_arch_z80:
488
      disassemble = print_insn_z80;
489
      break;
490
#endif
491
#ifdef ARCH_z8k
492
    case bfd_arch_z8k:
493
      if (bfd_get_mach(abfd) == bfd_mach_z8001)
494
	disassemble = print_insn_z8001;
495
      else
496
	disassemble = print_insn_z8002;
497
      break;
498
#endif
499
#ifdef ARCH_vax
500
    case bfd_arch_vax:
501
      disassemble = print_insn_vax;
502
      break;
503
#endif
6324 serge 504
#ifdef ARCH_visium
505
     case bfd_arch_visium:
506
       disassemble = print_insn_visium;
507
       break;
508
#endif
5221 serge 509
#ifdef ARCH_frv
510
    case bfd_arch_frv:
511
      disassemble = print_insn_frv;
512
      break;
513
#endif
514
#ifdef ARCH_moxie
515
    case bfd_arch_moxie:
516
      disassemble = print_insn_moxie;
517
      break;
518
#endif
519
#ifdef ARCH_iq2000
520
    case bfd_arch_iq2000:
521
      disassemble = print_insn_iq2000;
522
      break;
523
#endif
524
#ifdef ARCH_m32c
525
    case bfd_arch_m32c:
526
      disassemble = print_insn_m32c;
527
      break;
528
#endif
529
#ifdef ARCH_tilegx
530
    case bfd_arch_tilegx:
531
      disassemble = print_insn_tilegx;
532
      break;
533
#endif
534
#ifdef ARCH_tilepro
535
    case bfd_arch_tilepro:
536
      disassemble = print_insn_tilepro;
537
      break;
538
#endif
539
    default:
540
      return 0;
541
    }
542
  return disassemble;
543
}
544
 
545
void
546
disassembler_usage (stream)
547
     FILE * stream ATTRIBUTE_UNUSED;
548
{
549
#ifdef ARCH_aarch64
550
  print_aarch64_disassembler_options (stream);
551
#endif
552
#ifdef ARCH_arm
553
  print_arm_disassembler_options (stream);
554
#endif
555
#ifdef ARCH_mips
556
  print_mips_disassembler_options (stream);
557
#endif
558
#ifdef ARCH_powerpc
559
  print_ppc_disassembler_options (stream);
560
#endif
561
#ifdef ARCH_i386
562
  print_i386_disassembler_options (stream);
563
#endif
564
#ifdef ARCH_s390
565
  print_s390_disassembler_options (stream);
566
#endif
567
 
568
  return;
569
}
570
 
571
void
572
disassemble_init_for_target (struct disassemble_info * info)
573
{
574
  if (info == NULL)
575
    return;
576
 
577
  switch (info->arch)
578
    {
579
#ifdef ARCH_aarch64
580
    case bfd_arch_aarch64:
581
      info->symbol_is_valid = aarch64_symbol_is_valid;
582
      info->disassembler_needs_relocs = TRUE;
583
      break;
584
#endif
585
#ifdef ARCH_arm
586
    case bfd_arch_arm:
587
      info->symbol_is_valid = arm_symbol_is_valid;
588
      info->disassembler_needs_relocs = TRUE;
589
      break;
590
#endif
591
#ifdef ARCH_ia64
592
    case bfd_arch_ia64:
593
      info->skip_zeroes = 16;
594
      break;
595
#endif
596
#ifdef ARCH_tic4x
597
    case bfd_arch_tic4x:
598
      info->skip_zeroes = 32;
599
      break;
600
#endif
601
#ifdef ARCH_mep
602
    case bfd_arch_mep:
603
      info->skip_zeroes = 256;
604
      info->skip_zeroes_at_end = 0;
605
      break;
606
#endif
607
#ifdef ARCH_metag
608
    case bfd_arch_metag:
609
      info->disassembler_needs_relocs = TRUE;
610
      break;
611
#endif
612
#ifdef ARCH_m32c
613
    case bfd_arch_m32c:
614
      /* This processor in fact is little endian.  The value set here
615
	 reflects the way opcodes are written in the cgen description.  */
616
      info->endian = BFD_ENDIAN_BIG;
617
      if (! info->insn_sets)
618
	{
619
	  info->insn_sets = cgen_bitset_create (ISA_MAX);
620
	  if (info->mach == bfd_mach_m16c)
621
	    cgen_bitset_set (info->insn_sets, ISA_M16C);
622
	  else
623
	    cgen_bitset_set (info->insn_sets, ISA_M32C);
624
	}
625
      break;
626
#endif
627
#ifdef ARCH_powerpc
628
    case bfd_arch_powerpc:
629
#endif
630
#ifdef ARCH_rs6000
631
    case bfd_arch_rs6000:
632
#endif
633
#if defined (ARCH_powerpc) || defined (ARCH_rs6000)
634
      disassemble_init_powerpc (info);
635
      break;
636
#endif
637
    default:
638
      break;
639
    }
640
}